Spring常用注解
目录
IoC
创建对象
Spring 针对 Bean 管理中创建对象提供以下注解
@Service:习惯上声明在Service层
@Controller:习惯上声明在Web层
@Repository:习惯上声明在Dao层
@Component:不属于以上三层的统一使用该注解
四个注解功能是一样的,都可以用来创建 bean 实例,无功能区分,仅字面不同。
属性注入
@Autowired:根据属性类型进行自动装配
@Qualifier:根据名称进行注入
这个@Qualifier 注解的使用,和上面@Autowired 一起使用
@Autowired
@Qualifier(value = "userDaoImpl")
@Resource:可以根据类型注入,可以根据名称注入(不建议使用,因为不是spring里面自带的注解)
@Resource //根据类型进行注入*
@Resource(name = "userDaoImpl") //根据名称进行注入
@Value:注入普通类型属性
@Value(value = "abc")
AOP
创建代理对象
@Aspect:生成代理对象,声明在代理类的上面
通知(增强)
@Pointcut("execution(* com.wenbin.aopdemo1.dao.UserDao.*(..))"):提取公共切入点 要切入的类方法
以下注解的value属性里填写切入点
@Before:前置通知:被切入的方法执行之前执行(应用场景:各种校验)
@AfterReturning:后置通知:被切入的方法成功执行之后执行
@Around:环绕通知:被切入的方法执行之前 和 成功执行之后执行 分别执行
该注解声明的方法参数 ProceedingJoinPoint proceedingJoinPoint
proceedingJoinPoint.proceed();表示执行被切入的方法,在此前后切入对应增强逻辑
@AfterThrowing:异常通知:被切入的方法执行期间出现异常执行(应用:包装异常信息)
@After:最终通知:无论被切入的方法是否成功执行 在最终都进行执行(应用:统一管理资源)
事务
@Transactional:这个注解添加到类上面,也可以添加方法上面
如果把这个注解添加类上面,这个类里面所有的方法都添加事务
如果把这个注解添加方法上面,为这个方法添加事务
该注解的参数详细:
propagation:事务传播行为
ioslation:事务隔离级别:脏读、不可重复读、幻读
timeout:超时时间:事务需要在一定时间内进行提交,如果不提交进行回滚
readOnly:是否只读:读:查询操作,写:添加修改删除操作
rollbackFor:回滚:设置出现哪些异常进行事务回滚
noRollbackFor:不回滚:设置出现哪些异常不进行事务回滚
配置类
完全注解开发,功能替代 xml 配置文件
@Configuration:作为配置类,替代 xml 配置文件
@ComponentScan(basePackages = {"com.wenbin"}):扫描的指定包下的注解
@EnableAspectJAutoProxy(proxyTargetClass = true):开启 Aspect 生成代理对象
参数true代表是要生成代理对象时强制使用CGLIB的方式
@EnableTransactionManagement:开启事务
以上注解声明在类上面,使该类作为一个配置类替代以下xml配置文件
<!-- 开启注解扫描 扫描多个包用逗号隔开-->
<context:component-scan base-package="com.wenbin.aopdemo1"></context:component-scan>
<!-- 开启 Aspect 生成代理对象-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- 开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
以下java代码写在配置类中替代以下配置文件 实现完全注解开发
/**
* 创建数据库连接池
*/
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///jdbctest?useSSL=true&serverTimezone=UTC&rewriteBatchedStatements=true");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
/**
* 创建 JdbcTemplate 对象
*/
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
//到 ioc 容器中根据类型找到 dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入 dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
/**
* 创建事务管理器
*/
@Bean
public DataSourceTransactionManager
getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
<!-- 数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url"
value="jdbc:mysql:///jdbctest?useSSL=true&serverTimezone=UTC&rewriteBatchedStatements=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
</bean>
<!-- 创建 JdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 创建事务管理器-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>