Spring学习笔记之bean的基础知识
Bean:
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的基本构成。 二、创建 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"); } } 三、注入 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; } } 对于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方法可以看到属性都注入进去了。 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中增加了一个 <property name="date" value="2017-12-10"/> 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java-8过滤列表而不创建新的列表
- 如何从我从`java`目标分叉的Ant任务中停止Selenium服务器?
- java中this与super关键字的使用方法
- java – Realm中的allObjects()方法是否已被弃用?
- java.lang.ClassNotFoundException:org.apache.commons.la
- Java、C++中子类对父类函数覆盖的可访问性缩小的区别介绍
- Java 使用NIO进行快速的文件拷贝的代码
- java – 有人可以为Dagger 2提供一个很好的解释吗?
- java – 我可以将RELAX NG转换为XSD吗?
- Java – 在字符串中查找第一个重复字符的最佳方法是什么