spring注解@Configuration、@Bean、@Autowired、@Controller、@Service、@Component、@Repository、@Value

java和spring注解

深入理解Java注解及Spring对注解的增强(上)
深入理解Java注解及Spring对注解的增强(下)
SpringBoot 注解原理,自动装配原理

@Configuration和@Bean的关系

@Configuration和@Bean注解详解

被@Configuration修饰的类,spring容器中会通过cglib给这个类创建一个代理,代理会拦截所有被@Bean修饰的方法,默认情况(bean为单例)下确保这些方法只被调用一次,从而确保这些bean是同一个bean,即单例的。

@Bean和@Autowired

  • @Bean 告诉 Spring:“这是这个类的一个实例,请保留它,并在我请求时将它还给我”。
  • @Autowired
    说:“请给我一个这个类的实例,例如,一个我之前用@Bean注释创建的实例”。

@Autowired 和 @Resource

  • @Autowired 默认按类型装配 , @Resource 默认按名称装配
  • @Autowired
    @Qualifier(“bean的名字”)
    按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。
  • @Resource JSR-250提供的
    默认按名称装配,当找不到名称匹配的bean再按类型装配.
    可以写在成员属性上,或写在setter方法上

可以通过@Resource(name=“beanName”) 指定被注入的bean的名称, 要是未指定name属性, 默认使用成员属性的变量名,一般不用写name属性.

@Controller、@Service、@Component、@Repository

作用:定义不同类型的beans

代码:

// Component注解定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {
    String value() default "";

}

// Repository注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
    String value() default "";

}

// Service注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    String value() default "";

}

// Controller注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    String value() default "";

}
  • @Component spring基础的注解,被spring管理的组件或bean
  • @Repository 用于持久层,数据库访问层
  • @Service 用于服务层,处理业务逻辑
  • @Controller 用于呈现层,(spring-mvc)

@Value(#{})和@Value(${}) 通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。

@Value(#{}):
(1)常量注入

@Value("normal")

private String normal; // 注入普通字符串

@Value("classpath:com/hry/spring/configinject/config.txt")

private Resource resourceFile; // 注入文件资源

@Value("http://www.baidu.com")

private Resource testUrl; // 注入URL资源

(2)bean属性、系统属性、表达式注入@Value("#{}"),bean属性注入需要注入者和被注入者属于同一个IOC容器,或者父子IOC容器关系,在同一个作用域内。

@Value("#{beanInject.another}")

private String fromAnotherBean; // 注入其他Bean属性:注入beanInject对象的属性another,类具体定义见下面

@Value("#{systemProperties['os.name']}")

private String systemPropertiesName; // 注入操作系统属性

@Value("#{ T(java.lang.Math).random() * 100.0 }")

private double randomNumber; //注入表达式结果

(3)配置文件属性注入@Value("${}"),读取配置文件中的值注入
以下是application.yml文件中的某个属性

pattern: 
    dateformat: yyyy年MM月dd日 HH:mm:ss

利用@Value获取该属性,注入变量:

@Value(${pattern.dateformat})
private String dateformat;
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Systemd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值