Spring学习笔记(2)

2. Spring-注解

2.1. 注解的原理

对注解的原理这片博文写的很好:https://www.iteye.com/blog/freewxy-1149128 ,我引用一下:

注解(Annotation)提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化的方法,使我们可以再稍后某个时刻方便使用这些数据(通过解析注解来使用这些数据)用来将任何的信息或者元数据与程序元素(类、方法、成员变量等)进行关联。其实就是更加直观更加明了的说明,这些说明信息与程序业务逻辑没有关系,并且是供指定的工具或框架使用的。Annotation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的申明语句中。

Annotation其实是一种接口。通过java的反射机制相关的API来访问Annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。Java语言解释器在工作时会忽略这些Annotation,因此在JVM中这些Annotation“不起作用”的,只能通过配套的工具才能对这些Annotation类型的信息进行访问和处理。

简单来说,注解可以使Spring的配置工作变得更简洁,基于注解的配置提供了XML的替代方法。

2.2. 注解基础配置

注解注入在XML注入之前执行。因此,XML配置将覆盖通过两种方法连接的属性的注释。

创建springxml配置文件并开启对注解的支持,导入约束时需要多导入一个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容器注册4BeanPostProcessor

AutowirdAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor

这样就可以使用@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

2.3. 常用的注解

@Component

组件注解,把资源让spring来管理。相当于在xml中配置一个bean。需要使用<context:component-scan base-package=”...”/>扫描被注解的类才能作用,

属性:

value:指定beanid。如果不知道value属性,默认beanid是当前类的类名。首字母小写。

@Controller@Service@Repository

控制器注解、服务注解、仓库注解三个都是对@Component注解的一个衍生,作用及属性和@Component是一样的,不过提供了更加明确的语义化。(Controller指控制层,Service指业务层层,Repository指持久层)

@Autowired

byType的方式进行自动注入,当容器里不存在或存在多个同类型的bean时,会抛出异常。

@Qualifier

自动注入时检索beanid

@Resource

byName的方式进行自动注入

@Value

注入基本数据类型和String类型数据

@Scope

指定bean的作用范围,默认为singleton(单例),取值有prototype(多例)、requestsessionglobalsession

@PostConstruct

用于指定初始化方法

@PreDestroy

用于指定销毁方法

@Configuration

用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.Class)。

@ComponentScan

用于指定spring在初始化容器时要扫描的包。作用和context:component-scan是一样的.

属性:basePackage

@Bean

该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器.

属性:name(beanid)

@PropertySource

用于加载.properties文件中的配置.在配置数据源时常有.

@Import

导入其他类,在引入其他配置类时,可以不用再写@Configuration注解.

猜你喜欢

转载自www.cnblogs.com/HJYDR/p/12343717.html
今日推荐