Spring注解和配置方式
Spring提供了一个org.springframework.beans.factory.FactoryBean工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。 
从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean<T>的形式,在该接口中共定义了以下3种方法: 
T getObject():返回由FactoryBean创建的Bean的实例,若isSingleton()返回的是true,则该实例会放到Spring容器的单实例缓存池中 
boolean isSingleton():确定由FactoryBean创建的Bean的作用域是singleton还是prototype 
Class<T>getObjectType():返回FactoryBean创建Bean的类型
Bean的衍型注解: 
@Component:用于对Bean实现类进行标注 
@Repository:用于对DAO实现类进行标注 
@Service:用于对Service实现类进行标注 
@Controller:用于对Controller实现类进行标注
Spring提供了一个context命名空间,它提供了通过扫描类包以应用注解定义Bean的方式 
<beans ... 
       xmlns:context="http://www.springframework.org/schema/context"  
       ... 
       xsi:schemaLocation="http://www.springframework.org/schema/context/spring-context-3.0.xsd" 
       ... 
> 
<context:component-scan base-package="xxx]xx.x"> 
声明context命名空间后,即可通过context命名空间的component-scan的base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包里的所有类,并从类的注解信息中获取Bean的定义信息。若希望仅扫描特定的类而非基包下所有的类,那么可以使用resource-pattern属性过滤出特定的类 
<context:component-scan base-package="xxx.xx.x" resource-pattern="xxx/*.class">
<context:include-filter>表示要包含的目标类,而<context:exclude-filter>表示要抛出在外的目标类。一个<context:component-scan>下可以拥有若干个<context:exclude-filter>和<context:include-filter>元素,这两个元素均支持多种类型的过滤表达式。 
过滤表达式: 
annotation   所有标注了XxxAnnotation的类。该类型采用目标累是否标注了某个注解进行过滤。 
assignable   所有继承或扩展了XxxService的类。该类型采用目标类是否继承或扩展某个特定类进行过滤。 
aspectj      所有类名以Service结束的类及继承或扩展它们的类。 
regex        所有目录类包下的类。该类型采用正则表达式根据目录类的类名进行过滤 
custom       采用XxxTypeFile通过代码的方式根据过滤原则。该类必须实现org.springframework.core.type.TypeFilter
Spring通过@Autowired注解实现Bean的依赖注入。@Autowired默认按类型匹配的方式,在容器查找匹配的bean,当且仅当仅有一个匹配的Bean时,Spring将其注入到@Autowired标注变量中。如果容器中没哟一个和标注变量类型匹配的Bean,Spring容器启动时将报NoSuchBeanDefinitionException的异常。若希望Spring即使找不到匹配的Bean完成注入也不要抛出异常,则可使用@Autowired(required=false)进行标注。默认情况下,required的属性值为true。若容器中有一个以上匹配的Bean时,则可以通过@Qualifier注解限定Bean的名称 
@Autowired 
@Qualifier("userDao") 
private UserDao userDao;//若容器中存在userDao和otherUserDao
@Autowired还可以对成员变量及方法的入参进行标注,也可对入参标注@Qualifier以指定注入Bean的名称。 
一般情况下,在Spring容器中大部分的Bean都是单实例的,所以我们一般都无须通过@Repository、@Service等注解的value属性为Bean指定名称,也无须使用@Qualifier按名称进行注入。
若Spring发现变量是一个集合类,则它会将容器中匹配集合元素类型的所有Bean都注入进来。 
Spring还支持JSR250中定义的@Resource和JSR-330中定义的@Inject注解,这两个注解都是对类变量及方法入参提供自动注入的功能。@Resource要求提供一个Bean名称的属性,若属性为空,则自动采用标注处的变量名或方法作为Bean的名称。
@Component 
public class Boss{ 
   private Car car; 
   
   @Resource("car") 
   private void setCar(Car car){ 
       this.car = car ; 
   } 
} 
@Autowired默认按类型匹配注入Bean,@Resource则按名称匹配注入Bean。而@Inject也是按类型匹配注入Bean的,只不过它没有required属性。
Spring为注解配置提供了一个@Scope的注解,通过它可以显示指定Bean的作用范围。 
@Scope("prototype") 
@Component
Spring支持JSR-250中定义的@PostConstruct和@PreDestroy注解,在Spring中他们相当于initmethod和destroy-method属性功能。但可以在一个Bean中定义多个@PostConstruce和@PreDestroy。
JavaConfig是Spring的一个子项目,它旨在通过Java类的方式提供Bean的定义信息。普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息。
@Configuration 
public class AppConf{ 
   @Bean 
   public UserDao userDao(){ 
      return new UserDao(); 
   } 
}
Spring提供一个AnnotationConfigApplicationContext类,它能够直接通过标注@Configuration的Java类启动Spring容器。 
public class JavaConfigTest{ 
    public static void main(String[] args){ 
       ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class); 
       LogonService logonService = ctx.getBean(LogonService.class); 
    } 
} 
通过AnnotationConfigApplicationContext类的构造函数直接传入标注@Configuration的Java类,直接用该类中提供的Bean的定义信息启动Spring。此外,AnnotationConfigApplicationContext还支持通过编码的方式加载多个@Configuration配置类,然后通过刷新容器应用这些配置类。 
public class JavaConfigTest{ 
    public static void main(String[] args){ 
       ApplicationContext ctx = new AnnotationConfigApplicationContext(); 
       ctx.register(DaoConfi.class); 
       ctx.register(ServiceConfig.class); 
       ctx.refresh();
LogonService logonService = ctx.getBean(LogonService.class); 
    } 
} 
也可以通过@Import将多个配置类组装到一个配置类中。 
@Configuration 
@Import(DaoConfig.class) 
public class ServiceConfig{ 
    @Bean 
    public LogonService logonService(){ 
        LogonService logonService = new LogonService(); 
        return logonService; 
    } 
}
在@Configuration配置类中可以通过@ImportResource引入XML配置文件,在配置类中即可直接通过@Autowired引用XML配置文件中定义Bean。 
@Configuration 
@ImportResource("classpath:xxx/xx/x.xml")
Bean不同配置方式的比较 
Bean的定义 
基于XML配置:在XML中通过<bean>元素定义Bean 
基于注解配置:在Bean实现类出通过标注@Component或衍型类(@Service、@Repository、@Controller)定义Bean。 
基于Java类配置:在标注了@Configuration的Java类中,通过在类方法上标注@Bean定义一个Bean。方法必须提供Bean的实例化逻辑。 
Bean名称 
基于XML配置:通过<bean>的id或name属性定义 
基于注解配置:通过注解的value属性定义。默认名成为小写字母打头的类名 
基于Java类配置:通过@Bean的name属性定义 
Bean注入 
基于XML配置:通过<property>子元素或通过p命名空间的动态属性 
基于注解配置:通过在成员变量或方法入参出标注@Autowired,按类型匹配自动注入,还可配合使用@Qualifier按名称匹配注入 
基于Java类配置:比较灵活,可以通过在方法处通过@Autowired使方法入参绑定Bean,然后在方法中通过代码进行注入,还可以通过调用配置类的@Bean方法进行注入 
Bean生命过程方法 
基于XML配置: 通过<bean>的init-method和destroy-method属性指定Bean实现类的方法名,最多只能指定一个初始化方法和一个销毁方法。 
基于注解配置: 通过在目标方法上标注@PostContructor和@PreDestroy注解指定初始化和销毁方法,可以定义任意多个方法 
基于Java类配置: 通过@Bean的initMethod或destroyMethod指定一个初始化或销毁方法。对于初始化方法来说,可以直接在方法内部通过代码的灵活定义初始化逻辑 
Bean作用范围 
基于XML配置: 通过<bean>的scope属性指定 
基于注解配置: 通过在类定义处标注@Scope指定 
基于Java类配置: 通过在Bean方法定义处标注@Scope指定 
Bean延迟初始化 
基于XML配置: 通过<bean>的lazy-init属性指定,默认为default,继承与<beans>的default-lazy-init设置,默认为false 
基于注解配置: 通过在类定义处标注@Lazy指定 
基于Java类配置: 通过在Bean方法定义处标注@Lazy指定
基于XML配置使用场合:Bean实现类来源于第三方类库,因无法在类中标注注解,通过XML配置方式较好;命名空间的配置,只能采用基于XML的配置 
基于注解配置: Bean的实现类是当前项目开发的,可以直接在Java类中使用基于注解的配置 
基于Java类配置: 基于Java类配置的又是在于可以通过代码方式控制Bean初始化的整体逻辑。若实例化Bean的逻辑比较复杂,则比较适合基于Java类配置的方式
Spring注解和配置方式的更多相关文章
- SpringBoot学习(二)-->Spring的Java配置方式
		
二.Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @Bean Spring的Java配置方式是通过 @ ...
 - Spring 的java 配置方式
		
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1@Configuration 和 @Bean Spring的Java配置方式是通过 @Configuration 和 @ ...
 - Spring的Java配置方式—@Configuration和@Bean实现Java配置
		
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @BeanSpring的Java配置方式是通过 @Configuration 和 @Be ...
 - SpringBoot学习(二)——Spring的Java配置方式
		
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 一.@Configuration 和 @Bean Spring的Java配置方式是通过@Configuration和@Bean ...
 - Spring的Java配置方式
		
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1 @Configuration 和 @Bean Spring的Java配置方式是通过 @Configuration ...
 - springmvc学习指南 之---第25篇 Spring Bean有三种配置方式
		
writed by不要张艳涛, 从tomcat转到了springmvc 现在开始有点不知道该看什么书了,看完了springmvc 学习指南之后 又查了一些书,好多都是内容相近,在找书的过程之中,发现s ...
 - Spring AOP 不同配置方式产生的冲突问题
		
Spring AOP的原理是 JDK 动态代理和CGLIB字节码增强技术,前者需要被代理类实现相应接口,也只有接口中的方法可以被JDK动态代理技术所处理:后者实际上是生成一个子类,来覆盖被代理类,那么 ...
 - spring注解和xml方式区别详解
		
一.spring常规方式. 在使用注释配置之前,先来回顾一下传统上是如何配置 Bean 并完成 Bean 之间依赖关系的建立.下面是 3 个类,它们分别是 Office.Car 和 Boss,这 3 ...
 - Spring MVC Controller配置方式
		
第一种 URL对应Bean如果要使用此类配置方式,需要在XML中做如下样式配置 以上配置,访问/hello.do就会寻找ID为/hello.do的Bean,此类方式仅适用小型的应用系统 第二种 为UR ...
 
随机推荐
- (18)odoo规范
			
* 约定 # 命名会用 蛇形式或驼峰式 todo_task_stage 蛇形式 class TodoTask 驼峰式 变量名还是蛇形居多, 类名和方法名驼 ...
 - NT内存
			
在NT/2K/XP中,操作系统利用虚拟内存管理技术来维护地址空间映像,每个进程分配一个4GB的虚拟地址空间.运行在用户态的应用程序,不能直接访问物理内存地址:而运行在核心态的驱动程序,能将虚拟地址空间 ...
 - hdu  1561 The more, The Better (树上背包)
			
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
 - JQ添加移除css样式
			
1. addClass() - 添加CSS类 $("#target").addClass("newClass"); //#target 指的是需要添加样式的元素 ...
 - 盘点几种数据库的分页SQL的写法(转)
			
Data序列——盘点几种数据库的分页SQL的写法http://www.cnblogs.com/fireasy/archive/2013/04/10/3013088.html
 - java arrayCopy
			
int[] dest = new int[0]; int[] value = {1,2}; if(value != null && value.length>0) { int[] ...
 - js基础之ajax
			
必须搞懂的几个问题: 1.如何创建ajax对象? 2.如何连接服务器? 3.如何发送请求? 4.监控请求状态的事件是什么?分几个阶段?如何获取返回值? 答:onreadystatechange事件:一 ...
 - Oracle练习题20~33
			
20.查询score中选学多门课程的同学中分数为非最高分成绩的记录. 21. 查询成绩高于学号为“109”.课程号为“3-105”的成绩的所有记录. 22.查询和学号为108的同学同年出生的所有学生的 ...
 - POJ 1068 Parencodings 模拟 难度:0
			
http://poj.org/problem?id=1068 #include<cstdio> #include <cstring> using namespace std; ...
 - [开发笔记]-页面切图、CSS前端设计、JS
			
这两天在学习页面的切图,样式设计,把学习过程中注意的地方记录下来. 一. input输入框点击时去掉外边框 一般在IE,firefox下,设置 border:0 none; 即可.但在chrome下, ...