装配bean
spring提供两种容器
- Bean工厂:最简单的容器,提供基本的DI支持。
- Bean声称有两种方式:1为@Component这种 2为xml定义
- Bean装配两种方式:1为xml 装配(property,constructor-arg) 2为Autowired
- 应用上下文:基于beanfactory之上构建,提供面向应用的服务:例如解析文件信息的能力,以及发布应用事件的能力。
- ClassPathXmlApplicationContext: xml中读取。
- FileSystemXmlapplicaitonContext: 系统中,~/ d:/
- XmlWebApplicaitonContext: web应用下的xml配置文件。
- Bean的注入:构造器和setter,创建可以用工厂单例。
- Bean的作用域:默认是single,scope=“prototype”可以每次都创建一个;不同上下文创建的不一样。
- 生命周期:
- 可以在bean里声明init-method和destroy-method
- 也可以在beans中声明default-init-method,这种是执行自己类中的方法。
- 两者都有时,执行bean中的方法,覆盖default。
- 关键是针对于每个bean的,你声明多少bean就有多少个init和destroy方法。
- 注入:
- 注入值:<property name="xxx" value="xxx">
- 注入对象:<property name="xxx" ref="xxx"> 可以注入内部bean,这样没有名字。
- 注入集合
- list
- set
- map
- properties:如果map的key和value都为基本类型,则用properties
- 注入空值
下面是代码
public interface Star { public void singASong () ; } public class SuperStar implements Star{ private String name; public void setName(String name) { this.name = name; } public void init(){ System.out.println("SuperStar init"); } public void singASong () { System.out.println(name + "巨星在唱歌"); } } public interface Perform { public void perform (); public void performlist (); public void performmap(); } public class PerformShow implements Perform{ private Star star; private String cost; private List<Star> starList; private Map<String,Star> starMap; //for constructor-arg public PerformShow() { } public PerformShow(Star star,String cost) { this.star = star; this.cost = cost; } private static class singleTon{ static Perform instance = new PerformShow(); } //for setter property public void setStar(Star star) { this.star = star; } public void setCost(String cost) { this.cost = cost; } //for setter list public void setStarList(List<Star> starList) { this.starList = starList; } //for setter map public void setStarMap(Map<String, Star> starMap) { this.starMap = starMap; } //singlton public static Perform getInstance (){ return singleTon.instance; } //init destroy public void init(){ System.out.println("PerformShow INIT"); } public void destroy(){ System.out.println("PerformShow destroy"); } //funtion public void perform(){ System.out.println(cost); star.singASong(); } public void performlist(){ System.out.println(cost); for(Star star:starList){ star.singASong(); } } public void performmap(){ System.out.println(cost); for(Map.Entry<String,Star> mapEntry:starMap.entrySet()){ mapEntry.getValue().singASong(); } } }
xml为
<?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" default-init-method="init"> <bean id="performconstructor" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow"> <!--构造器注入,简单值用value,对象用再声明一个bean,ref--> <constructor-arg ref="star"/> <constructor-arg value="constructor花了好几百万"/> </bean> <bean id="performsetter" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow"> <!--构造器注入,简单值用value,对象用再声明一个bean,ref--> <property name="star" ref="star"/> <property name="cost" value="setter花了好几百万"/> </bean> <bean id="performlist" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow"> <!--构造器注入,简单值用value,对象用再声明一个bean,ref--> <property name="starList"> <list> <ref bean="star1"/> <ref bean="star2"/> <ref bean="star3"/> <ref bean="star4"/> </list> </property> <property name="cost" value="setter list花了好几百万"/> </bean> <bean id="performap" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow"> <!--构造器注入,简单值用value,对象用再声明一个bean,ref--> <property name="starMap"> <map> <entry key="巨星1" value-ref="star1"/> <entry key="巨星2" value-ref="star2"/> <entry key="巨星3" value-ref="star3"/> <entry key="巨星4" value-ref="star4"/> </map> </property> <property name="cost" value="setter map花了好几百万"/> </bean> <!--工厂singleton--> <!--<bean id="performSingle" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow"--> <!--factory-method="getInstance">--> <!--</bean>--> <bean id="star" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar"> <property name="name" value="刘德华"/> </bean> <bean id="star1" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar"> <property name="name" value="刘德华"/> </bean> <bean id="star2" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar"> <property name="name" value="黎明"/> </bean> <bean id="star3" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar"> <property name="name" value="张学友"/> </bean> <bean id="star4" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar"> <property name="name" value="郭富城"/> </bean> </beans>
测试类为
public class TestBeanInjectionInitDestroy { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-injection-init-destroy.xml"); Perform performconstructor = (Perform)context.getBean("performconstructor"); System.out.println("constructor start=====>>>>>>>>>> " + performconstructor.hashCode()); performconstructor.perform(); Perform performsetter = (Perform)context.getBean("performsetter"); System.out.println("setter start=====>>>>>>>>>> " + performsetter.hashCode()); performsetter.perform(); Perform performlist = (Perform)context.getBean("performlist"); System.out.println("setter list start=====>>>>>>>>>> " + performlist.hashCode()); performlist.performlist(); Perform performmap = (Perform)context.getBean("performap"); System.out.println("setter map start=====>>>>>>>>>> " + performmap.hashCode()); performmap.performmap(); // Perform performSingle = (Perform)context.getBean("performSingle"); // System.out.println(performSingle.hashCode()); } }
结果为
SuperStar init PerformShow INIT PerformShow INIT SuperStar init SuperStar init SuperStar init SuperStar init PerformShow INIT PerformShow INIT constructor start=====>>>>>>>>>> 846857501 constructor花了好几百万 刘德华巨星在唱歌 setter start=====>>>>>>>>>> 1759890638 setter花了好几百万 刘德华巨星在唱歌 setter list start=====>>>>>>>>>> 1189682735 setter list花了好几百万 刘德华巨星在唱歌 黎明巨星在唱歌 张学友巨星在唱歌 郭富城巨星在唱歌 setter map start=====>>>>>>>>>> 1924973575 setter map花了好几百万 刘德华巨星在唱歌 黎明巨星在唱歌 张学友巨星在唱歌 郭富城巨星在唱歌