Spring(1)Bean的注解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/m0_38060977/article/details/102756495

@Autowired:

自动注入

  1. 默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值
  2. 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
  3. @Qualifier(“bookDao”):使用@Qualifier指定需要装配的组件的id,而不是使用属性名
  4. 自动装配默认一定要将属性赋值好,没有就会报错;
    可以使用@Autowired(required=false);
  5. 支持@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的别名

扫描二维码关注公众号,回复: 7622562 查看本文章
    @Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })
    public DataSource dataSource() {
        // instantiate, configure and return DataSource bean...
    }

@configuration

配置类中多次调用被@bean修饰的方法,返回的是同一个对象
具体详见:https://www.cnblogs.com/duanxz/p/7493276.html

推荐阅读

  1. 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration

参考

猜你喜欢

转载自blog.csdn.net/m0_38060977/article/details/102756495