一、配置项

1.id

2.class (必要)

3.scope (作用域)

3.constuctor arguments (构造器参数)

4.properties

5.autowiring mode (自动装配模式)

6.lazy-initialization (懒加载模式)

7.initialization / Destruction method (初始化/销毁方法)

 

二、作用域

1.Singleton: 单例,一个Bean容器中只存在一个实例

2.prototype: 每次请求都创建一个新的实例,destroy不生效只在GC回收

3.request: 每次http请求只创建一个实例,且只在该request内有效

4.session: 类似request

5.global session: 主要用于多系统集成、单点登录等,类似session

配置实例:

<bean id="testBean" class="org.znufe.Bean.testBean" scope="singleton"></bean>

 

三、生命周期

1.定义

2.初始化

3.Service

4.销毁

 

可以配置自定义初始化/销毁方法,在创建实例前或者销毁实例前调用。

(1) 通过配置单个bean的init-method / destory-method属性指向自定义方法

注:如果类中无指定方法会报错

<bean id="testBean" class="org.znufe.Bean.testBean" init-method="myInit()"></bean>
public class testBean {

    public void myInit() {
    }

}

(2)单个bean通过实现org.springframework.beans.factory.InitializingBean接口,覆盖afterPropertiesSet方法自定义初始化;

或者实现org.springframework.beans.factory.DisposableBean接口,覆盖destory方法

public class testBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() throw Exception{
    }

}
public class testBean implements DisposableBean {

    @Override
    public void destory() throw Exception{
    }

}

(3)配置文件中出现的所有bean设置全局默认初始化或销毁方法

注:类中可以没有全局方法

<beans
    ……  ……
    ……  ……
    default-init-method="myInit" default-destory-method="myDestory" >
</
beans>

注:如果用多种方式设置指定初始化/销毁方法,执行顺序是先执行接口的方法然后执行配置文件指定方法;全局默认方法只会在前两者都没有时执行。

 

四、利用Aware获取资源

1.Aware类型与对应资源

 

2.基本用法(实现对应接口,覆盖接口中的方法)

例1:假设已配置好MyApplication并命名为myApplication,ApplicationContextAware用法如下

public class MyApplication implements ApplicationContextAware {
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeanExceprion {
        System.out.println(applicationContext.getBean("myApplication");
    }
}

例2:假设已配置好MyBeanName并命名为myBeanName,BeanNameAware用法如下

public class MyBeanName implements BeanNameAware {
    
    @Override
    public void setApplicationContext(String beanName) {
        System.out.println("MyBeanName: " + beanName );
    }
}

 

3.进阶用法

先获取容器中的Bean然后把该Bean的Name传给容器资源,再利用容器资源与传入的Name再次获取Bean

public class MyAware implements BeanNameAware, ApplicationAware {

    private String beanName;

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
        System.out.println("BeanName: " + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeanException {
        System.out.println("ApplicationContext: " + applicationContext.getBean(this.beanName));
    }
}

 

五、注入方式

 

事先配好两个bean,MyWiringService与MyWiringDAO。

<beans
    ……  ……
    ……  …… >

    <bean id="myWiringService" class="org.znufe.Bean.MyWiringService">
        <property name="myWiringDAO" ref="myWiringDAO"></property>
    </bean>

    <bean id="myWiringDAO" class="org.znufe.Bean.MyWiringDAO"></bean>

</beans>    
public class MyWiringService {
    
    private MyWiringDAO myWiringDAO;

    public void Greet(String word) {
        this.myWiringDAO.Greet(word);
    }
}
public class MyWiringDAO {
    
    public void Greet(String word) {
        System.out.println("DAO Greets: " + word);
    }

}

测试方法如下

public void test() {
    MyWiringService myWiringService = super.getBean("myWiringService");
    myWiringService.Greet("Hello World!");
}

设置全局注入方式之后,可以简化bean的配置,比如在MyWiringService中增加对属性myWiringDAO的Setter方法并配置了全局注入方式(byName或者byType),可以去掉对属性myWiringDAO的配置;或者在MyWiringService中增加包含MyWiringDAO类型参数的构造函数,并配置了全局注入方式(constructor),可以去掉对属性myWiringDAO的配置。

 

下图为byName或者byType的配置方式

<beans
    ……  ……
    ……  …… 
    default-autowire="xxxxxx">

    <bean id="myWiringService" class="org.znufe.Bean.MyWiringService"></bean>

    <bean id="myWiringDAO" class="org.znufe.Bean.MyWiringDAO"></bean>

</beans>  
public class MyWiringService {
    
    private MyWiringDAO myWiringDAO;

    public void setMyWiringService(MyWiringDAO myWiringDAO) {
        System.out.println("Run Service Setter.");
        this.myWiringDAO = myWiringDAO;
    }

    public void Greet(String word) {
        this.myWiringDAO.Greet(word);
    }
}

输出结果:

Run Service Setter.

DAO Greets: Hello World!

 

1.byName方式执行test()

把XML配置的bean的id与myWiringService一致的bean注入到myWiringService,然后调用myWiringService.Greet();

myWiringService.Greet()实际调用了myWiringDAO.Greet(),myWiringDAO又是通过同样查找id的方式注入的。

 

2.byType方式执行test()

把XML配置的bean的class类型(bean的id有无或者id值不会影响注入)与MyWiringService一致的bean注入到myWiringService,然后调用myWiringService.Greet();

myWiringService.Greet()实际调用了myWiringDAO.Greet(),myWiringDAO又是通过同样查找class的方式注入的。

 

下图为constructor的注入方式配置

<beans
    ……  ……
    ……  …… 
    default-autowire="constructor">

    <bean id="myWiringService" class="org.znufe.Bean.MyWiringService"></bean>

    <bean id="myWiringDAO" class="org.znufe.Bean.MyWiringDAO"></bean>

</beans>  
public class MyWiringService {
    
    private MyWiringDAO myWiringDAO;

    public MyWiringService(MyWiringDAO myWiringDAO) {
        System.out.println("Run Service Constructor.");
        this.myWiringDAO = myWiringDAO;
    }

    public void Greet(String word) {
        this.myWiringDAO.Greet(word);
    }
}

输出结果:

Run Service Constructor.

DAO Greets: Hello World!

 

3.constructor方式执行test()

把XML配置的bean的id与myWiringService一致的bean注入到myWiringService,然后调用myWiringService.Greet();

myWiringService.Greet()实际调用了myWiringDAO.Greet(),myWiringDAO则是在myWiringService的构造器中通过查找构造器参数类型(类似byType)的bean被注入;

所以MyWiringDAO这个bean配置的id不会对注入过程造成影响。