作者: Wyt
Spring笔记(1) - 工厂
Spring笔记(2) - AOP编程
Spring笔记(3) - 持久层整合
Spring笔记(4) - MVC框架整合
Spring笔记(5) - 注解编程入门
Spring笔记(6) - 注解编程基础
//概念: 指的是在类或者方法上加入特定的注解(@ ),完成特定功能的开发
@Component
public class xxx{}
1. 注解开发方便
代码整洁
开发速度大大提高
2. Spring开发潮流
Spring2.x引入注解
Spring3.x完善注解
Springboot普及 推广注解编程
1. 替换XML这种配置形式,简化配置
2. 替换接口,实现调用双方的契约性
通过注解的方式,在功能调用者和功能提供者之间达成协定,进而进行功能的调用。因为注解应用更为方便灵活,所以在现在的开发中,更推荐通过注解的形式完成
1. Spring2.x开始支持注解编程 如Component @Service @Scope ...
目的:提供的这些注解只是为了在某些情况下简化XML配置,作为XML开发的有益补充
2. Spring3.x @Configuration @Bean ...
目的:彻底替换XML,基于纯注解编程
3. Spring4.x 衍生出SpringBoot框架
提倡使用注解进行常见开发
4. Spring5.x
变化不大,依然是提倡注解的开发
* 在Spring框架应用注解时,如果对注解配置的内容不满意,可以通过Spring配置文件进行覆盖
* 这个阶段的注解,仅仅是简化XML的配置,并不能完全替代XML
<context:component-scan base-package="包名"/>
* 作用:
让Spring框架在设置包及其子包扫描对应的注解,使其生效
作用:替换原有spring配置文件中的 bean 标签
注意:
id属性 component注解 提供了默认的设置方式 id首字母为小写
class属性 通过反射获得class内容
细节:
(1)指定工厂创建对象的id值
@Component("id值")
(2)Spring配置文件覆盖注解配置内容
注意:id值和class值要和注解中的设置保持一致
具体操作:
1. Repository DAO
2. Service Service
3. Controller Controller
注意:
(1)本质上这些衍生注解就是@component,他们的作用、细节和用法都是完全一致的。
(2)在Spring整合MyBatis开发过程中,不使用@REpository, @Component
目的:更加准确地表达一个类型的作用
作用:控制简单对象的创建次数
代替
注意:不添加@Scope时,Spring提供默认值 singleton
作用:延迟创建单实例对象
说明:对于单实例对象,Spring默认会在工厂创建的同时创建该对象
一旦使用了@Lazy注解后,Spring会在使用这个对象的时候,进行对这个对象的创建
替代
1. 初始化相关方法
@PostConstruct
InitializingBean
替代
2. 销毁方法
@PreDestroy
DisposableBean
替代
注意:
1. 上述的两个注解并不是Spring提供的,是JSR(JavaEE规范)520提供的
2. Spring兼容了JSR
3. 再一次的验证,通过注解实现了接口的契约型
功能:对类成员变量、方法及构造函数进行标注,完成自动装配的工作
替代
@Repository
public class UserDAOImpl implements UserDAO {
@Override
public void save() {
System.out.println("UserDAOImpl.save");
}
}
@Service
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public UserDAO gerUserDAO() {
return this.userDAO;
}
@Autowired
public void setUserDAO(UserDAO userDAO) {
System.out.println("UserServiceImpl.setUserDAO");
this.userDAO = userDAO;
}
@Override
public void register() {
this.userDAO.save();
}
}
/**
* 用于测试:@Autowired注释
*/
@Test
public void test03() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
UserService userServiceImpl = (UserService) ctx.getBean("userServiceImpl");
userServiceImpl.register();
}
UserServiceImpl.setUserDAO
UserDAOImpl.save
@Autowired细节
1. Autowired注解基于类型进行注入 [推荐]
基于类型的注入:注入对象的类型,必须与目标成员变量类型相同或者是其子类(实现类)
2. Autowired Qualifier 基于名字进行注入 [了解]
基于名字的注入:注入对象的id值,必须与Qualifier注解中设置的名字相同
3. Autowired注解放置位置
a) 放置在对应成员变量的set方法上
b) 直接把这个注解放置在成员变量之上,Spring通过反射直接对成员变量进行注入(赋值)[推荐]
如:
@Autowired
@Qualifier("userDAOImpl")
private UserDAO userDAO;
4. JavaEE规范中类似功能的注解
JSR250 @Resouce(name="userDAOImpl") 基于名字进行注入
替代:
@Autowired()
@Qualifier("userDAOImpl")
注意:如果在应用Resource注解时,名字没有配对成功,那么他会继续按照类型进行注入。
JSR330 @Inject 作用 @Autowired完全一致 基于类型进行注
主要应用在EJB3.0中,在Spring中应用很少,了解即可
javax.inject
javax.inject
1
@Value注解完成
1. 设置xxx.properties
id = 10
name = Jordan
2. Spring的工厂读取这个配置文件
3. 代码
属性 @Value("${key}")
@Value("${id}")
private Integer id;
@Value("${name}")
private String name;
1. 作用:用于替换Spring配置文件中的 标签
2. 开发步骤
1. 设置 xxx.properties
id = 10
name = suns
2. 应用
@Component
@PropertySource("classpath:/xxx.properties")
public class XXX{}
3. 代码
属性 @Value()
不能使用在静态成员变量上,否则会出现赋值 (注入)失败的情况
@Value注解+Properties这种方式,不能注入集合类型
* Spring提供新的配置形式 YAML YML
这种配置形式在SpringBoot被广泛使用
配置文件.xml中
范围:当前包 及其 子包
<context:component-scan base-package="">
<context-exclude-filter type="" expression=""/>
<context-exclude-filter type="" expression=""/>
<context-exclude-filter type="" expression=""/>
context:component-scan>
type:
(1)assignable 排除指定的类型,不进行扫描
(2)annotation 排除指定的注解,不进行扫描
(3)aspectj (方便) 切入点表达式
包切入点:com.wyt.bean..*
类切入点:*..User
(4)regex 正则表达式
(5)custom 自定义排除策略,一般用于框架底层的开发
<context:component-scan base-package="" use-default-filters="false">
<context-include-filter type="" expression=""/>
context:component-scan>
详解:
1. use-default-filters="false"
作用:让Spring默认的注解扫描方式失效
2.
作用:指定扫描哪些注释
type:
(1)assignable 包含指定的类型,进行扫描
(2)annotation 包含指定的注解,进行扫描
(3)aspectj (方便) 切入点表达式
包切入点:com.wyt.bean..*
类切入点:*..User
(4)regex 正则表达式
(5)custom 自定义包含策略,一般用于框架底层的开发
* Spring注解配置和配置文件的配置可以互通
@Repository
public class UserDAOImpl{
}
public class UserServiceImpl{
private UserDAO userDAO;
set get
}
基础注解(@Component @Autowired @Value) 程序员开发类型的配置
1. 在程序员开发的类型上 可以加入对应注解 进行对象的创建
如:User UserService UserDAO UserAction
2. 应用其他非程序员开发的类型时,还是需要使用 bean标签 进行配置的
如:SqlSessionFactoryBean MapperScannerConfigure
<context:component-scan base-package=""/>
DAO (Spring+Mybatis)
1. 配置文件的配置
1. DataSource
2. SqlSessionFactory -> SqlSessionFactoryBean
1. dataSource
2. typeAliasesPackage
3. mapperLocations
3. MapperScannerConfigur -> DAO接口实现类
2. 编码
1. entity
2. table
3. DAO接口
4. 实现Mapper文件
Service
1. 原始对象 --> 注入DAO
@Service -> @Autowired
2. 额外功能 --> DataSourceTransactionManager --> dataSource
3. 切入点 + 事务属性
@Transactional(propagation,readOnly...)
4. 组装切面
Controller (Spring+Struts2)
1. @Controller
@Scope("prototype")
public class RegAction implements Action{
@Autowired
private UserService userServiceImpl;
}
2. struts.xml