文章目录
java和spring注解
深入理解Java注解及Spring对注解的增强(上)
深入理解Java注解及Spring对注解的增强(下)
SpringBoot 注解原理,自动装配原理
@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;