@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;
}