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

文章目录

  • java和spring注解
  • @Configuration和@Bean的关系
  • @Bean和@Autowired
  • @Autowired 和 @Resource
  • @Controller、@Service、@Component、@Repository
  • @Value(#{})和@Value(${}) 通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。

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;

你可能感兴趣的:(java,spring,mvc,java,注解)