一样
Autowired & @Resource 都可以用来Bean的注入,可以写在属性(字段)上、也可以写在setter方法上
不一样
1.来源不一样
@Autowired 由Spring提供
@Resource 由J2EE提供
2.注入方式不一样
@Autowired 默认ByType(按类型注入),若需按名字,则配合使用@Qualifier,默认依赖对象必须存在,若允许不存在,需指定required=false
@Resource 默认ByName(按名字注入),若找不到对应的Bean,会继续按类型去找;但一旦指定了name,那么只会按名字去找Bean
3.不重要的不一样
@Autowired 使用属性(字段)注入的话,有的编译器要警告,建议使用构造方法注入;@Resource 则不会,然而,@Resource不能使用构造方法注入
如果使用属性(字段)注入的话,则容易出现NullPointerException;如果使用setter方法注入,则属性不能设置为final
争论:
有人说使用@Resource可以解耦(个人不太认同,为什么呢?)
首先,使用注解进行对Bean的注入,但是,我们得需要一个机制(一些处理类<解析器>)来对这些使用了@Autowired & @Resource 进行解析,比如:
我们会在applicationContext.xml 中配置 <context:annotation-config/> ----这句话的作用就是:激活那些已经在spring容器里注册过的bean,@Autowired 、@Resource注解本身不能做任何事情,我们需要一些工具来处理这些,而这句配置就是来加载这里工具(如上面的四个Processor)
@Configuration public class BeanConfig { @Bean public Student student() { return new Student(); } @Bean public Course course() { return new Course(student()); } }
@Component public class BeanConfig { @Bean public Student student() { return new Student(); } @Bean public Course course() { return new Course(student()); } }
- 扫描(@ComponentScan)+ 组件使用注解类(@Controller、@Service、@Repository、@Configuration、@Component);
- 用@Bean注解;
- 用@Import
注解
注解;- @Import快速注册;For Example:@Import(value = {BeanConfig.class, UserVO.class}),UserVO可以使用@Component,也可以不使用
- 实现ImportSelector接口
- 实现ImportBeanDefinitionRegistrar接口
- 用FactoryBean接口;
基本作用域(singleton、prototype)
,Web 作用域(reqeust、session、globalsession)
,自定义作用域
。Spring默认使用singleton作用域
-
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
-
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
-
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
-
session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
-
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效