温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spring中bean基础知识的示例分析

发布时间:2021-09-15 11:08:24 来源:亿速云 阅读:154 作者:小新 栏目:编程语言

这篇文章主要为大家展示了“Spring中bean基础知识的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring中bean基础知识的示例分析”这篇文章吧。

Bean:

  • 在Spring技术中是基于组件的

  • 最基本了是最常用的单元

  • 其实实例保存在Spring的容器当中

Bean通常被定义在配置文件当中,Bean实例化由Spring的Ioc容器进行管理,Bean的实例可以通过Beanfactory进行访问,实际上大部分J2EE应用,Bean是通过ApplicationContext来访问的,ApplicationContext是BeanFactory的子接口,功能要比BeanFactory强大许多

在前面得博客依赖注入与控制反转中演示了应用spring实现ioc,在ApplicationContext.xml中有bean的配置,里面只是bean简单的应用。这篇主要是进一步学习使用bean。

一、定义

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="DaoImpl" class="Cuiyw.Spring.Dao.DaoImpl"></bean> <bean id="ServiceImpl" class="Cuiyw.Spring.Service.ServiceImpl" scope="singleton"> <property name="dao" ref="DaoImpl"></property> </bean> </beans>

上面的代码是之前博客配置的,可以看到bean的基本构成。 <beans/>是Sring配置文件的根节点,一个<beans/>节点里面可以有多个<bean>节点。在bean中常用两个属性:ID,Class. ID是一唯一标识,来确定是哪个bean,可以让其他bean中使用id引用。class用来指定是哪个class。同时还可以设置scope属性,scope有两种:singleton,non-singelton。singleton:单实例模式(默认,构造方法为private),整个Spring的容器中只有一个共享实例存在(singleton)。non-singelton:每次请求该bean,Spring容器都会新建立一个bean实例,然后返回给程序(request,session,prototype)。

二、创建

Bean的命名机制

id 当在Spring的窗口当中,查找某个Bean对象时,首先根据id进行查找,将其余作为Bean的默认名称,如果ID属性不存在,则根据Name属性进行查找(将其中的第一个名称作为默认的名称),如果ID和NAME都不存在根据类的名称进行查找。id---------->name--------------->类名。

Bean的别名:可以使用alias来为bean指定别名.

下面的配置文件还是在上面的xml基础上修改的。这里配置了ID为ServiceImpl的bean设置了别名。我们可以使用它的name、id、alias来获取service。

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="DaoImpl" class="Cuiyw.Spring.Dao.DaoImpl"></bean> <bean id="ServiceImpl" class="Cuiyw.Spring.Service.ServiceImpl" scope="singleton" name="ServiceA"> <property name="dao" ref="DaoImpl"></property> </bean> <alias name="ServiceA" alias="ServiceA1"/> </beans>
package Cuiyw.SpringAop; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import Cuiyw.Spring.IService.IService; public class App  {  public static void main( String[] args )  {  ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"ApplicationContext.xml"});  BeanFactory factory=context;  IService service=(IService)factory.getBean("ServiceA1");  service.service("Cuiyw ServiceA1");   service=(IService)factory.getBean("ServiceA");  service.service("Cuiyw ServiceA");   service=(IService)factory.getBean("ServiceImpl");  service.service("Cuiyw ServiceImpl");   } }

Spring中bean基础知识的示例分析

三、注入

1.基本类型和string

可以使用value元素来设置,在上面的代码基础上稍作修改

<property name="baseProperty" value="222"></property>
package Cuiyw.Spring.Service; import Cuiyw.Spring.IDao.IDao; import Cuiyw.Spring.IService.IService; public class ServiceImpl implements IService{  private IDao dao;  private int baseProperty;  public IDao getDao() {   return dao;  }  public void setDao(IDao dao) {   this.dao = dao;  }  public void service(String name) {   System.out.println(dao.sayHello(name)+" baseProperty:"+getBaseProperty());  }  public int getBaseProperty() {   return baseProperty;  }  public void setBaseProperty(int baseProperty) {   this.baseProperty = baseProperty;  } }

Spring中bean基础知识的示例分析

对于string类型,XML解析器以String类型解析出数据,如果属性不是String类型,属性值会通过PropertyEditors转换为其他类型,比如时间类型.

2.注入bean

上面的代码中就注入了bean,在ServiceImpl中注入DaoImpl。可以使用ref来进行配置。

3.注入集合

常见的集合有list、map、set、property等,下面的代码是在ServiceImpl中定义了几个属性,然后在上下文中通过属性注入进去。为了测试,在DaoImpl中也增加了一个属性s。

package Cuiyw.Spring.Dao; import java.util.Calendar; import Cuiyw.Spring.IDao.IDao; public class DaoImpl implements IDao{  public String s;  public String getS() {   return s;  }  public void setS(String s) {   this.s = s;  }  public String sayHello(String name) {   int hour=Calendar.getInstance().get(Calendar.HOUR_OF_DAY);   if(hour<6) return "凌晨早,"+name;   if(hour<12)return "早上好,"+name;   if(hour<13)return "中午好,"+name;   if(hour<18)return "下午好,"+name;   return "晚上好,"+name+", s="+s;     }  }
package Cuiyw.Spring.Service; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import Cuiyw.Spring.IDao.IDao; import Cuiyw.Spring.IService.IService; public class ServiceImpl implements IService{  private IDao dao;  private int baseProperty;  private List<Object> lists;  private Set<Object> sets;  private Map<Object, Object> maps;  private Properties pros;  public IDao getDao() {   return dao;  }  public void setDao(IDao dao) {   this.dao = dao;  }  public void service(String name) {   System.out.println(dao.sayHello(name)+",baseProperty:"+getBaseProperty());   for(int i=0;i<lists.size();i++)   {    Object obj=lists.get(i);    System.out.println(obj.getClass().getName());   }   for(Object obj : sets)   {    System.out.println(obj.getClass().getName());   }   //遍历maps中的key   for (Object key : maps.keySet()) {    System.out.println("Key = " + key);   }   //遍历maps中的值   for (Object value : maps.values()) {    System.out.println("Value = " + value);   }    Set<String> pro=pros.stringPropertyNames();    Iterator<String> it=pro.iterator();    while(it.hasNext()){     Object key=it.next();     System.out.println(key+"----"+pros.getProperty((String) key));     }  }  public int getBaseProperty() {   return baseProperty;  }  public void setBaseProperty(int baseProperty) {   this.baseProperty = baseProperty;  }  public List<Object> getLists() {   return lists;  }  public void setLists(List<Object> lists) {   this.lists = lists;  }  public Set<Object> getSets() {   return sets;  }  public void setSets(Set<Object> sets) {   this.sets = sets;  }  public Map<Object, Object> getMaps() {   return maps;  }  public void setMaps(Map<Object, Object> maps) {   this.maps = maps;  }  public Properties getPros() {   return pros;  }  public void setPros(Properties pros) {   this.pros = pros;  } }

主要是注入的配置,在list、map、set属性中都是配置了一个基础类型value=1,两个DaoImpl类型。

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="DaoImpl" class="Cuiyw.Spring.Dao.DaoImpl">  <property name="s" value="cyw"></property> </bean> <bean id="ServiceImpl" class="Cuiyw.Spring.Service.ServiceImpl" scope="singleton" name="ServiceA">  <property name="dao" ref="DaoImpl"></property>  <property name="baseProperty" value="222"></property>  <property name="lists">    <list>    <value>1</value>    <ref bean="DaoImpl" />    <bean class="Cuiyw.Spring.Dao.DaoImpl">     <property name="s" value="cuiywlists" />    </bean>   </list>  </property>  <property name="sets">    <set>    <value>1</value>    <ref bean="DaoImpl" />    <bean class="Cuiyw.Spring.Dao.DaoImpl">     <property name="s" value="cuiywsets" />    </bean>   </set>  </property>  <property name="maps">    <map>    <entry key="key1" value="1"></entry>    <entry key="key2" value-ref="DaoImpl"></entry>    <entry key="key3" >    <bean class="Cuiyw.Spring.Dao.DaoImpl">     <property name="s" value="cuiywmaps" />    </bean>    </entry>   </map>  </property>  <property name="pros">   <props>    <prop key="prokey1">prokeyA</prop>    <prop key="prokey2">prokeyB</prop>   </props>  </property> </bean> <alias name="ServiceA" alias="ServiceA1"/> </beans>

执行main方法可以看到属性都注入进去了。

Spring中bean基础知识的示例分析

4.自定义属性编辑器

对于有一些属性是没法注入的,此时就需要自定义,比如上面说的日期类型。

首先是要定义一个继承PropertyEditorSupport的类,重写setAsText方法。

package Cuiyw.Spring.Service; import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.text.SimpleDateFormat; public class CustomerProperty extends PropertyEditorSupport {  private String format="yyyy-MM-dd";  public String getFormat() {   return format;  }  public void setFormat(String format) {   this.format = format;  }  @Override  public void setAsText(String text) throws IllegalArgumentException {   // TODO Auto-generated method stub   SimpleDateFormat sdf=new SimpleDateFormat(format);   //super.setAsText(text);   try {    //转换对象,能过setValue方法重新赋值    this.setValue(sdf.parse(text));   } catch (ParseException e) {    e.printStackTrace();   }  } }

然后在配置文件配置这个类

<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">  <property name="customEditors">  <map>  <entry key="java.util.Date" value="Cuiyw.Spring.Service.CustomerProperty"/>  </map>  </property> </bean>

这里还是在ServiceImpl中增加了一个java.util.Date类型的date属性。并在配置文件注入值。

<property name="date" value="2017-12-10"/>

以上是“Spring中bean基础知识的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI