Spring的组件自动扫描机制

来源:http://blog.163.com/qqabc20082006@126/blog/static/2292852520091128103316534/

 

Spring的组件自动扫描机制

2009-12-2810:33:16|分类:Spring|字号订阅

Spring将所有的bean都纳入到IOC中创建、管理和维护。对于大型的项目而言,项目中会有成百上千个bean,如果我们都在配置文件中配置,那么我们就会增加配置文件的体积,显得过于臃肿,过于庞大,查找维护起来也不太方便。

Spring2.5中引入了组件自动扫描机制,通过在classpath自动扫描的方式把组件纳入到Spring容器中。这大大减少了程序员在配置XML文件上的时间,使得配置文件显得干净,整洁,便于维护。

这种机制的工作步骤是:

1.配置需要扫描的类;

2.在需要被纳入Spring容器的类上加上相应的注解;

3.Spring在类路径下寻找标注了注解的类,并把这些类纳入Spring容器中管理。

它的作用是和在XML文件中使用<bean>节点配置组件是一样的。

自动扫描组件的使用

第一步:配置applicationContext.xml文件;如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<beans

xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd

">

<!--打开Spring组件自动扫面,并配置要扫描的基本包-->

<context:component-scanbase-package="com.springtest"></context:component-scan>

</beans>

注:<context:component-scan>节点用于通知Spring容器扫描组件,base-package属性用于指定将要被扫描的组件所在的包名称。

第二步:为需要被扫描的类添加相应的注解;注解的类型有以下几种:

·@Service用于标注业务层组件;

·@Repository用于标注数据访问层组件;

·@Controller用于标注控制层组件(如:Struts中的action)

·@Component表示泛型组件,当组件不好归类的时候,我们可以使用这个组件进行注解。

第三步:当为类添加完成注解后,我们需要测试相应的组件是否被纳入Spring容器,所以我们需要测试组件是否被扫描;如下:

@Test

publicvoidtestAddUser()

{

UserBizuserBiz=(UserBiz)context.getBean("userBizImpl");

System.out.println(userBiz);

}

如果输出不为空,则说明测试类已经被扫描并且纳入了Spring容器。

细节问题总结:

1.当我们进行测试时,用ApplicationContext对象的getBean()方法寻找组件。在之前的配置文件中我们会用<bean>标签的id属性去定义,在使用注解后怎样获得组建的id呢?

在这种情况下,Spring会将被标注注解的类名拿到,然后再将该类名的第一个字母变为小写,放到getBean()方法中。如:UserBizImpl类的组件Id就会是userBizImpl,获取时为context.getBean("userBizImpl");

那么,我们在使用注解时可以自定义组件的Id吗?

当然可以。我们需要在为相应的类添加注解时,在注解之后添加自定义的类名,例如:

@Service("userBiz")

publicclassUserBizImplimplementsUserBiz{

……

}

当我们在获取该组件时,为context.getBean("userBiz);

2.在配置文件中我们可以对组件(bean)的作用域范围进行设置,它的默认值是单例模式,那么在添加注解的情况下,我们怎样设置组件的作用域范围呢?

我们可以直接在为类添加注解的同时,运用另一个注解@Scope("prototype")来设置,如下

@Service("userBiz")@Scope("prototype")

publicclassUserBizImplimplementsUserBiz{

……

}

3.在使用注解时,为组件设置初始化和销毁方法:

在添加注解的相应的类中,如果想初始化或销毁某个方法,我们可以直接在方法上添加注解,如下:

@PostConstruct

publicvoidaddItem(){

System.out.println("初始化方法");

}

@PreDestroy

publicvoidtestItem(){

System.out.println("释放资源");

}

4.在使用Spring自动扫描组件后,怎样进行依赖注入?

运用注解@Resource@Autowired,并为依赖对象设置名称,例如:

@Resource(name="userDao")

privateUserDAOuserDao=null;

首先它会根据名称去找Spring自动扫描的并加入到Spring容器的组件(bean),如果有相同的名称,则进行依赖注入,如果没有相同的名称。则会根据类型区寻找组件。

 

 

 

<context:component-scanbase-package="com.mycompany">

<context:include-filtertype="regex"expression="com\..mycompany\..service\...*"/>

<context:exclude-filtertype="aspectj"expression="com.mycompany.util..*"/>

</context:component-scan>

 

当有<context:component-scan/>后,就可以将<context:annotaion-config/>移除了。

 

你可能感兴趣的:(spring)