测试类:
//测试工厂bean 单多实例 @Test public void test01(){ ApplicationContext context=new ClassPathXmlApplicationContext("503bean5.xml"); MyBean myBean1 = context.getBean("myBean", MyBean.class); MyBean myBean2 = context.getBean("myBean", MyBean.class); System.out.println(myBean1==myBean2);//false工厂类是多实例 System.out.println(myBean1); System.out.println("-------------------单实例测试-"); //设置为单实例的时候在加载spring配置文件的时候就会创建单实例对象 ApplicationContext context1=new ClassPathXmlApplicationContext("502bean4.xml"); Employee emp1 = context1.getBean("emp",Employee.class); Employee emp2=context1.getBean("emp",Employee.class); System.out.println(emp1==emp2);//单实例 true 可以通过scope属性值设置为单实例(singleton) System.out.println("-------------------多实例测试-"); //设置为多实例的时候在getBean的时候才会创造多实例对象 Employee emp3 = context1.getBean("emp2",Employee.class); Employee emp4=context1.getBean("emp2",Employee.class); System.out.println(emp3==emp4);//多实例 false 可以通过scope属性值设置为多实例(prototype) } //bean的生命周期 @Test public void test02(){ ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("503bean5.xml"); MyBean bean1 = context.getBean("bean1", MyBean.class); System.out.println("对象创建完成"); System.out.println(bean1); //销毁 context.close(); } //自动装配 @Test public void test03(){ ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("503bean5.xml"); Employee emp = context.getBean("emp", Employee.class); System.out.println(emp); }
生命周期测试的结果
工厂被构造 无参构造调用 set方法被调用 初始化方法调用 对象创建完成 MyBean{name='bean的属性被注入'} 对象被销毁
实体类
@Component(value="thisBean")//就是之前写的id值,默认值是类名称首字母小写 public class MyBean { private String myName; public MyBean() { System.out.println("无参构造调用"); } public String getName() { return myName; } public void setName(String name) { this.myName = name; System.out.println("set方法被调用"); } @Override public String toString() { return "MyBean{" + "name='" + myName + '\'' + '}'; } //创建执行的初始化的方法 public void initMethod(){ System.out.println("初始化方法调用"); } //销毁的方法 public void destroyMethod(){ System.out.println("对象被销毁"); } //测试方法 public void test(){ System.out.println("test here"); } }
bean的后置处理器
public class MyBeanPost implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("后置处理器before方法"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("后置处理器after方法"); return bean; } }
工厂bean
public class MyFactoryBean implements FactoryBean { public MyFactoryBean() { System.out.println("工厂被构造"); } @Override public boolean isSingleton() { return false; } //定义返回bean @Override public Object getObject() throws Exception { MyBean myBean=new MyBean(); System.out.println("工厂的set方法被调用"); myBean.setName("abc"); return myBean; } @Override public Class<?> getObjectType() { return null; } }
503bean5.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"> <bean id="myBean" class="day503FactoryBean.MyFactoryBean"></bean> <bean id="bean1" class="day503FactoryBean.MyBean" init-method="initMethod" destroy-method="destroyMethod"> <property name="name" value="bean的属性被注入" > </property> </bean> <!--配置后置处理器 所有的bean都会执行该方法--> <!--<bean id="myBeanPost" class="day503FactoryBean.MyBeanPost"></bean>--> <!--自动装配autowire byName:bean id名字必须和属性的名字必须一致 byType:每种类型只能有一个 --> <bean id="emp" class="day502IOC.Employee" autowire="byName"></bean> <bean id="dep" class="day502IOC.Department"></bean> </beans>
502bean4.xml
<!--默认是单实例--> <bean id="emp" class="day502IOC.Employee"> <property name="ename" value="charles"></property> <!--内部bean嵌套创建对象--> <property name="dep"> <bean id="dept" class="day502IOC.Department"> <property name="did" value="1"></property> </bean> </property> </bean> <!--级联赋值1(和外部bean相似)多实列--> <bean id="emp2" class="day502IOC.Employee" scope="prototype"> <property name="ename" value="charles"></property> <!--内部bean嵌套创建对象--> <property name="dep" ref="dept2"></property> </bean> <bean id="dept2" class="day502IOC.Department"> <property name="did" value="2"></property> </bean>