对注解的原理这片博文写的很好:https://www.iteye.com/blog/freewxy-1149128 ,我引用一下:
注解(Annotation)提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化的方法,使我们可以再稍后某个时刻方便使用这些数据(通过解析注解来使用这些数据)用来将任何的信息或者元数据与程序元素(类、方法、成员变量等)进行关联。其实就是更加直观更加明了的说明,这些说明信息与程序业务逻辑没有关系,并且是供指定的工具或框架使用的。Annotation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的申明语句中。
Annotation其实是一种接口。通过java的反射机制相关的API来访问Annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。Java语言解释器在工作时会忽略这些Annotation,因此在JVM中这些Annotation是“不起作用”的,只能通过配套的工具才能对这些Annotation类型的信息进行访问和处理。
简单来说,注解可以使Spring的配置工作变得更简洁,基于注解的配置提供了XML的替代方法。
注解注入在XML注入之前执行。因此,XML配置将覆盖通过两种方法连接的属性的注释。
创建spring的xml配置文件并开启对注解的支持,导入约束时需要多导入一个context名称空间下的约束.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean>...</bean>
</beans>
之前说了注解本质上是接口,在XML里面注入注解bean,IOC容器才能识别加载注解的内容。首先是<context:annotation-config>,这是一个context命名空间提供的配置方法,使用这个声明等于隐式地向spring容器注册4个BeanPostProcessor:
AutowirdAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor。
这样就可以使用@Resource、@PostConstruct、@PreDestroy、@PersistenceContext、@Autowired、@Required等注解,实现自动注入。
其次是<context:component-scan base-package=”...”>声明,除了具有annotation-config的功能之外,scan会扫描base-package包下扫描以及注册Javabean。同时将带有@Component、@Service、@Repository、@Controller等注解的对象注册到spring容器中
因此当使用context:component-scan后,就可以将context:annotation-config移除。
值得注意的一点是annotation-config并不提供扫描包的功能,使用@Component等注解声明的bean对象只有用component-scan才能扫描并注册到容器里。
详情参考:https://www.cnblogs.com/zhangsonglin/p/11181064.html
@Component
组件注解,把资源让spring来管理。相当于在xml中配置一个bean。需要使用<context:component-scan base-package=”...”/>扫描被注解的类才能作用,
属性:
value:指定bean的id。如果不知道value属性,默认bean的id是当前类的类名。首字母小写。
@Controller@Service@Repository
控制器注解、服务注解、仓库注解三个都是对@Component注解的一个衍生,作用及属性和@Component是一样的,不过提供了更加明确的语义化。(Controller指控制层,Service指业务层层,Repository指持久层)
@Autowired
按byType的方式进行自动注入,当容器里不存在或存在多个同类型的bean时,会抛出异常。
@Qualifier
自动注入时检索bean的id
@Resource
按byName的方式进行自动注入
@Value
注入基本数据类型和String类型数据
@Scope
指定bean的作用范围,默认为singleton(单例),取值有prototype(多例)、request、session、globalsession等
@PostConstruct
用于指定初始化方法
@PreDestroy
用于指定销毁方法
@Configuration
用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.Class)。
@ComponentScan
用于指定spring在初始化容器时要扫描的包。作用和context:component-scan是一样的.
属性:basePackage
@Bean
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器.
属性:name(即bean的id)
@PropertySource
用于加载.properties文件中的配置.在配置数据源时常有.
@Import
导入其他类,在引入其他配置类时,可以不用再写@Configuration注解.
原文:https://www.cnblogs.com/HJYDR/p/12343717.html