0
点赞
收藏
分享

微信扫一扫

Spring中的注解

RockYoungTalk 2021-09-25 阅读 95
日记本
@Component

标注该类是一个普通的bean类

@Controller

标注该类是一个控制器组件类

@Service

标注该类是一个业务逻辑组件类

@Repository

标注该类是一个数据库组件类

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";

}
@ComponentScan(basePackages = {"com.test","com.demo.*"})

配置扫描组件的基本包、会扫描com.test和com.demo下面的@Component、@Controller、@Service、@Repository注解

@MapperScan({"com.demo.mapper","com.demo.*.mapper"})

配置扫描myBatis中的mapper文件路径

@SpringBootApplication

项目的入口,启动类的标识。该类中会定义一个main方法,运行main方法的时候会自动读取配置文件并且加载指定资源,并且进行初始化。
@SpringBootApplication注解被@EnableAutoConfiguration、@SpringBootConfiguration、@ComponentScan这三个注解修饰。


@EnableAutoConfiguration:启动自动配置。
@SpringBootConfiguration:允许上下文注册额外的Bean或者导入其他的配置类。
@ComponentScan:在指定包上启动@Component扫描。

@Autowired

告诉spring为属性注入一个值。
注意:使用@Autowired注入的时候,首先会去容器中查找对应类型的Bean:

  • 如果没有查到,抛出空指针异常。可以配置@Autowired(required = false)让注入的类可以为null
  • 如果查到一个,直接将该Bean返回并装载。
  • 如果查到多个,会按照名称来查找。
    可以通过 @Qualifier("CommonService")注解指定查找的类名称。
    如果没有手动指定会默认查找类名首字母小写的类。
    例如:CommonService 会按 commonService来查找。
@PostConstruct和@PreDestroy

这两个注解不是Spring提供的,而是Java提供的。

  • @PostConstruct:被这个注解修饰的方法会在Servlet加载的时候被执行,并且只会被执行一次,可以用来做一些初始化操作,@PostConstruct 修饰的方法在构造函数后执行,在init()方法之前执行。@PreDestroy修饰的方法在destory()方法之后执行。
    (下图为引用)


在Spring 中 ,Constructor、@Autowired、@PostConstruct的执行顺序为:
Constructor >> @Autowired >> @PostConstruct
那么@PostConstruct的妙用在哪里呢?
例如:有两个实例 A,B
我们在初始化A的时候需要使用B的实例进行一些操作,可以如果使用@Autowired注解注入B的话,只有在Constructor 步骤完成,也就是A,B都初始化之后才可以进行注入,所以没法使用@Autowired进行一些初始化操作。
这时候就可以使用@PostConstruct注解了,使用@Autowired注入后再将需要初始化的值进行赋值。

下面问题演示:

问题描述:我需要在这个类初始化的时候为 staticA 进行初始化,因为这个变量是static修饰的,所以在类第一次被加载的时候就会进行注入,那时A的实例注入的一定是null,所以就需要对staticA进行初始化。但是在执行到@Autowired的时Constructor 步骤已经完成,这时候怎么样进行初始化呢?
解决:使用@PostConstruct 对 staticA进行初始化。

    @Autowired
    private A a;
    @Autowired
    private static A staticA;

    @PostConstruct
    public void init() {
        staticA = a;
    }
举报

相关推荐

0 条评论