Spring——注解编程
第一章 注解的基本概念
1.1 什么是注解编程
指的是在类或者方法上加上特定的注解(@XXX),完成特定功能的开发。如:
@Component
public class OrderService{
...
}
1.2 为什么要讲解注解编程
- 注解开发非常方便:代码简洁,开发速度大大提高。
- Spring开发的潮流:Spring 2.x引入注解,Spring 3.x完善注解,SpringBoot 普及推广注解编程。
1.3 注解的作用
- 替换xml这种配置形式,简化配置。
- 替换接口,实现调用双方的契约型。
- 通过注解的方式在功能的调用者和功能的提供者之间达成约定,进而进行功能的调用。因为注解的应用更为方便灵活,所以在现在的开发中,更为推荐使用注解的方式完成开发。
1.4 Spring注解的发展历程
- Spring2.x 开始支持注解编程:@Component、@Service、@Scope等;
- 目的:提供这些注解只是为了在某些情况下简化xml的配置,作为xml开发的有益增补。
- Spring3.x 提供了更多的注解:@Configuration @Bean等;
- 目的:彻底替换xml配置,基于纯注解编程。
- Spring4.x 开始衍生出了SpringBoot。
- 提倡使用注解完成常用开发。
1.5 Spring注解开发的一个问题
- Spring基于注解进行配置后,还能否解耦合?
- 在Spring框架应用注解时,如果对注解配置的内容不满意,可以通过Spring配置文件进行覆盖。
第二章 Spring的基础注解
这个阶段的注解,仅仅是简化xml的配置,并不能完全替代xml。
2.1 对象创建的相关注解
-
搭建开发环境
<context:component-scan base-package="com.itheima.ssm"> <!-- 不扫描Controller注解 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> 作用:让Spring框架在设置包及其自爆中扫描对应的注解,使其生效。
-
对象创建相关注解
-
@Component:
作用:用于替换原有spring配置文件中的<bean>标签,进而创建对象。 注意: id属性 component注解 提供了默认的设置方式 首单词首字母小写 class属性 通过反射获得class内容
-
@Component细节:
-
如何显式指定工厂创建对象的id值:
@Component("user")
-
Spring配置文件覆盖注解配置内容:
在applicationContext.xml文件中,配置标签,指定id与@Component注解指定的id一致: <bean class="com.itheima.ssm.domain.User" id="user"/>
-
-
@Component的衍生注解:
@Repository:表示持久层的@Component @Service:表示业务层的@Component @Controller:表示表现层的@Component 注意:本质上这些衍生注解就是@Component,它的作用、细节、用法都是完全一致的。 目的:更加准确的表法一个类型的作用。
-
@Scope:
作用:用于控制简单对象的创建次数。 注意:如果不提供@Scope注解,默认就是singleton
-
@Lazy:
作用:用于延迟创建单实例对象。(在getBean的时候创建对象) 注意:一旦使用了@Lazy注解后,Spring会在使用这个对象的时候,进行这个对象的创建。
-
生命周期方法相关注解:
1. 初始化相关方法 @PostConstruct 在方法上添加@PostConstruct,指定该方法为初始化方法 2. 销毁方法 @PreDestroy 在方法上添加@PreDestroy,指定该方法为销毁方法 注意: 1.上述的2个注解并不是Spring提供的,是由JSR(JavaEE规范)520提供的; 2.再一次的验证,通过注解实现接口的契约型。
-
2.2 注入相关注解
-
用户自定义类型的注入:
@Autowired 细节: 1. Autowired注解是基于类型来进行注入: - 注入对象的类型,必须与目标成员变量类型相同或是其子类(实现类) 2. Autowired注解配合Qualifier注解 可以 基于名字进行注入: - 基于名字的注入,注入对象的id值,必须与Qualifier注解中设置的名字相同 3. Autowired注解放置的位置 a) 放置在对应成员变量的set方法上 b) 直接把注解放置在对应成员变量上,Spring会通过反射直接对成员变量进行赋值(注入)【推荐】 4. JavaEE规范中类似功能的注解: JSR250 @Resource(name = "xxx") 这个注解相当于Autowired注解+Qualifier注解 注意:如果在应用Resource注解时,名字没有配对成功,那么他会继续按照类型进行注入
-
JDK类型变量的注入:
@Value注解完成 1. 设置xxx.properties id = 10 name = suns 2. Spring工厂读取这个配置文件 <context:property-placeholder location="init.properties" file-encoding="gbk"/> 3. 代码 属性上加上注解:@Value("${key}")
-
@PropertiesSource
作用:用于替换Spring配置文件中的<context:property-placeholder/>标签 开发步骤: 1. 设置xxx.properties id = 10 name = suns 2. 应用@Properties注解: @PropertySource(value = "init.properties",encoding = "gbk") 3. 代码 属性上加上注解:@Value("${key}")
-
@Value注解使用细节
-
@Value不能使用在静态成员变量上。
如果应用,赋值(注入)将失败
-
@Value注解+Properties的这种方式,不能注入集合类型。
Spring提供了新的配置形式:YAML YML(SpringBoot)
-
-
2.3 注解扫描详解
<context:component-scan base-package="com.itheima.ssm"/>
这个注解扫描,针对当前包及其子包
这种方法扫描包,比较宽泛,会将所有的包中的所有类都扫描进去。所想要扫描的类有针对性,有两种方法:
-
排除方式
<context:component-scan base-package="com.itheima.ssm"> <context:exclude-filter type="" expression=""/> <!-- 其中type属性有五种: assignable:排除特定的类型 不进行扫描 annotation:排除特定的注解 不进行扫描 aspectj:通过包(类)切入点表达式 排除特定包(类)【推荐使用】 regex:正则表达式 custom:自定义排除策略,应用在框架的底层开发 --> </context:component-scan> 注意:排除策略可以叠加使用,即多个<context:exclude-filter/>同时生效
-
包含方式
<context:component-scan base-package="com.itheima.ssm" use-default-filters="false"> <context:include-filter type="aspectj" expression="com.itheima.ssm..*"/> </context:component-scan> 1. use-default-filters="false": 作用:让Spring默认的注解扫描策略(全部扫描) 失效 2. <context:include-filter/> 作用:指定扫描哪些注解,type属性和排除方式中的一致。 3. 包含方式也支持叠加
2.4 对于注解开发的思考
-
配置互通
Spring注解配置的类 与 配置文件的配置的类 是互通的
-
什么情况下使用注解?什么情况下使用配置文件?
@Component注解 替换 <bean 基础注解(@Component、@Autowired、@Value)只能用于程序员开发类型的配置 1. 在程序员开发的类型上,可以加入对应注解,进行对象的创建; 如:User、UserServiceImpl等 2. 应用其他非程序员开发的类型时,还是需要使用<bean 进行配置的 如:SqlSessionFactoryBean、MapperScannerConfigure等
2.5 SSM整合开发(半注解开发)
-
搭建开发环境
- 引入相关jar坐标【SSM POM】
- 引入相关配置文件
- applicationContext.xml
- springmvc-config.xml
- log4j.properties
- XxxMapper.xml
- 初始化配置
- web.xml文件中,引入ContextLoaderListener创建Spring工厂
- web.xml文件中,引入SpringMVC的前端控制器DispatcherServlet
-
编码
<context:component-scan base-package=""
-
DAO(Spring+MyBatis)
1. 配置文件的配置 - DataSource - SqlSessionFactoryBean 1.datasource 2.typeAliasesPackage 3.mapperLocations - MapperScannerConfigure 2.编码 1.entity 2.table 3.DAO接口 4.实现mapper文件
-
Service
1. 原始对象 --> 注入Dao 2. 额外功能 --> DataSourceTransactionManager --> datasource 3. 切入点 + 事务属性 @Transactional(propagation,readonly,...) 4. 组装切面 <tx:annotation-driven transaction-manager="transactionManager"/>
-
Controller(Spring + SpringMVC)
1. 配置文件的配置 - <context:component-scan 扫描Controller类所在的包 - InternalResourceViewResolver - <mvc:default-servlet-handler/> - <mvc:annotation-driven/> 2. 在Controller类中注入Service
-
第三章 Spring的高级注解(Spring 3.x及以上)
3.1 配置Bean
Spring在3.X提供的新的注解,用于替换XML配置文件
@Configuration
public class AppConfig {
}
-
配置bean在应用的过程中 替换了XML具体什么内容?
配置bean替换了applicationContext.xml配置文件
-
AnnotationConfigApplicationContext
1. 创建工厂代码 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(); 2. 指定配置文件 2.1 指定配置bean的