目录
- @Autowired:
- @Resource:
- @Component
- @Controller
- @Primary
- @Bean
- @configuration
- 推荐阅读
- 参考
@Autowired:
自动注入
- 默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值
- 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
- @Qualifier(“bookDao”):使用@Qualifier指定需要装配的组件的id,而不是使用属性名
- 自动装配默认一定要将属性赋值好,没有就会报错;
可以使用@Autowired(required=false); - 支持@Primary
在方法和构造器上自动装配
1.默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作
2.[标注在方法位置,]:@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配
@Bean//@Autowired可省略
public Color color(Car car){
Color color = new Color();
color.setCar(car);
return color;
}
3.[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取
//如果只有一个构造器,@Autowired可以省略
public Boss(Car car){
this.car = car;
System.out.println("Boss...有参构造器");
}
@Resource:
- 可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;
- 没有能支持@Primary功能;没有支持@Autowired(reqiured=false)
- 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入
@Component
@Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
@Controller
对应表现层的Bean
使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=“UserAction”)】或者【@Controller(“UserAction”)】,则使用value作为bean的名字。
这里的UserAction还使用了@Scope注解,@Scope(“prototype”)表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scop
@Primary
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Bean
是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名
接受生命周期的回调
public class Foo {
public void init() {
// initialization logic
}
}
public class Bar {
public void cleanup() {
// destruction logic
}
}
@Configuration
public class AppConfig {
@Bean(initMethod = "init")
public Foo foo() {
return new Foo();
}
@Bean(destroyMethod = "cleanup")
public Bar bar() {
return new Bar();
}
}
bean的别名
@Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })
public DataSource dataSource() {
// instantiate, configure and return DataSource bean...
}
@configuration
配置类中多次调用被@bean修饰的方法,返回的是同一个对象