3. autowirescope和aware接口

Posted yuanGrowing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3. autowirescope和aware接口相关的知识,希望对你有一定的参考价值。

3.1 自动装配属性autowire

在之前的例子中,我们都是通过设置xml文件中的bean属性,来进行依赖注入,spring为我们提供了autowire属性来进行自动装配。
autowire提供了五种自动装配的方式,我这里只学了一下byName方式(我觉得在这个最好用了)。
在文档中对这个方法的描述:

就是在你的bean中如果有一个名为master的属性,而且这个bean被配置为autowire-byName,那么spring容器在初始化的时候会在所有的
bean中自动的寻找名为master的bean,然后将它自动的注入。如下面的UserDao中有名为user的属性UserBean,
public class UserDao 
private UserBean user ;
private int id;
private  String name ;
// get/set 方法
在配置文件中,我们没有使用property标签对userdao进行依赖注入,只是配上了autowire属性。而配置文件中还有一个bean就是被命名为user的UserBean。
<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="user" class="com.example.maven.UserBean">
<property name="name" value="test"></property>
</bean>
<bean id="userdao" class="com.example.maven.UserDao" autowire="byName">

</bean>

</beans>
测试代码:
ApplicationContext app = new ClassPathXmlApplicationContext("spring-main.xml");
      UserDao userDao = (UserDao) app.getBean("userdao");
      System.out.println(userDao.getUser().getName());
结果:
test

( 在支持注释的spring中,还有一个@Autowired的注释,这个以后再学)

3.2 scope属性
spring中,对于一个bean的生命周期(姑且这么叫吧)有五种:
(在bean配置中加上 scope=singleton或者下面任意一种即可)

    3.2.1 singleton  单例
        如果你知道单例模式,那么也就一定能理解Singleton。就是在一个ioc容器中,只有一个bean的实例,不管有它被多少个bean作为
    依赖注入,每一次注入的都是同一个bean实例。

    3.2.2 prototype 
        就是每一次调用bean,都会重新实例化一个bean出来。

    3.2.3 request
        每一次http请求中所需要用的bean,都是新实例化出来的,但是在同一次请求中不会实例化两个相同的bean。也就是说,这种模式下,对
    这种作用域下,不同的http请求中的bean相当于是prototype,同一次请求相当于Singleton。

    3.2.4 session
        我们都知道,网站后台的session可以用来长时间保存用户浏览信息等,在这个session中实例化出来的bean拥有和session一样的生命周期。
    3.2.5 global session
        和session差不多。

   ( 注意:Request 、session、global session的bean 必须通过web-ApplicationContext,比如XmlWebApplicationContext,不能使用ClassPathXmlApplicationContext,进行获取,否则,会产生 IllegalStateException 。而且,这几个必须在web项目中才能使用)

3.3 aware接口
      aware是感知的意思,spring文档中用两个接口BeanNameAware 和ApplicationContext讲解了aware类型接口的作用。
       3.3.1  BeanNameAware 
               对于一个bean来说,它有很多有用的方法,但是它没有办法知道自己在spring容器中的名字,而BeanNameAware 这个接口可以让一个
        bean实现对容器中自己名字的感知。如下:在容器完成bean的初始化(依赖注入之后,init()等函数执行之前)之后马上就执setBeanName。  然后通过getBeanname就能获取到bean的id。
public class UserDao implements BeanNameAware
    private  String beanname ;
//这个是BeanNameAware接口中定义的方法
public void setBeanName(String s) 
    this.beanname = s ;


public String getBeanname() 
    return beanname;

      3.3.2ApplicationContextAware
    同理,这个接口是让bean拥有感知ApplicationContext的能力。
public class UserDao implements ApplicationContextAware
    ApplicationContext applicationContext ; 
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
        this.applicationContext = applicationContext;
    
        3.3.3 学会了上面两个接口的使用,那么其他的aware类型的接口也应该没有问题了。

以上是关于3. autowirescope和aware接口的主要内容,如果未能解决你的问题,请参考以下文章

Spring原理分析-Aware接口&InitializingBean

Spring的感知能力 Aware

第 09 章:虎行有雨,定义标记类型Aware接口,实现感知容器对象

手写Spring,定义标记类型Aware接口,实现感知容器对象

spring中的aware接口

spring中aware接口的