Spring 的“零配置”支持“ 的学习
1、搜索Bean类
在不实用Spring配置文件来配置任何Bean实例,那么我们只能指望Spring会自动搜索某些路径下的Java类,并将这些java类注册为Bean实例。
Spring会合适的将显示指定路径下的类全部注册成Spring Bean。 Spring通过使用特殊的Annotation来标注Bean类。
>@Component :标注一个普通的Spring Bean类。
>@Controller : 标注一个控制器组件类。
>@Service: 标注一个业务逻辑组件类。
>@Repository : 标注一个DAO组件类。
使用@Component 来标注一个类:
package org.service.imp; import org.service.Person; import org.springframework.stereotype.*; @Component public class Chinese implements Person { public String sayHello(String name) { // TODO Auto-generated method stub return name + ":你好!"; } public void eat(String food) { // TODO Auto-generated method stub System.out.println(”我喜欢吃:“+food) ; } }
接下来需要在Spring的配置文件中指定搜索路径,Spring将会自动搜索该路径下的所有JAva类,并根据这些类创建Bean实例:
<?xml version="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.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 自动搜索指定包及其子包下的所有Bean类--> <context:component-scan base-package="org.service"> </context:component-scan> </beans>
主程序:
package org.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { //创建Spring容器 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取Spring 容器中的所有Bean实例的名 System.out.println("---------------------" +java.util.Arrays.toString(ctx.getBeanDefinitionNames())) ; } }
通过运行主程序;可以得到 Spring中的Bean实例的名字是:chinese。Bean实例的名字默认是Bean类的首字母小写,其他地方不变。当然,Spring也允许在使用@Component 标注时指定Bean实例的名称。格式如:@Component(”Bean实例名字")
在默认情况下,Spring会自动搜索所有以@Component、@Controller 、@Service 和 @Repository 标注的Java类,并将他们当作Spring Bean来处理。
我们还可以通过为<component-scan .. /> 元素添加 <include-filter .. /> 或 <exclude-filter ../>子元素来指定Spring Bean类 , 只要位于指定的路径下的Java类满足这种重柜子,即使Java类没有使用Annotation 标注,Spring一样可以把它们当成 Bean类来处理。
<include-filter ... /> 元素使用与指定满足该规则的Java类 会被当成Bean类,而<exclude-filter .../>相反。
> type : 指定过滤器类型。
> expression : 指定过滤器所需要的表达式。
Spring 内建支持如下过滤器。
> annotation : Annotation 过滤器 ,该过滤器需要指定一个Annotation名.
> assignable : 类名过滤器, 该过滤器直接指定一个Java类
> regex : 正则表达式过滤器,该过滤器指定一个正则表达式 , 匹配该正则表达式的Java类将满足过滤规则。
> aspectj : AspectJ过滤器。
2、指定Bean的作用域:
采用零配置方式来管理Bean 实例时,可以使用@Scope Annotation 在指定Bean 的作用域。
3、使用@Resource配置依赖:
@Resource 有一个name属性,在默认情况下,Spring将这个值解释为需要被注入的Bean实例的名字。相当于<property../>元素的 ref 属性的效果 。
4、使用@PostConstruct 和 @PreDestroy 制定生命周期行为
前者是修饰的方法是Bean的初始化方法,后者修饰的方法是Bean 销毁之前的方法。这与Spring 提供的<bean .. /> 元素指定的 init-method 、destroy-method 属性的作用差不多。