【Java从0到架构师】Spring - 纯注解开发
纯注解开发
- 纯注解开发 - AOP
- 纯注解开发 - 整合 MyBatis
- 纯注解开发 - 事务管理
- JSR 注解
- JSR 注解 - @Resource、@Inject
- JSR 注解 - @PostConstruct、@PreDestroy
- property-placeholder 的底层
- component-scan 详解
Java 从 0 到架构师目录:【Java从0到架构师】学习记录
学习 Spring 搭配这门课效果更好:《孙哥说Spring5》学习笔记
Gitee 代码:https://gitee.com/szluyu99/mj_java_frame/tree/master/02_Spring/
关联文章:
- Spring 基础注解(对象创建相关注解、注入相关注解、注解扫描详解)
- Spring 高级注解(@Configuration、@Bean、@ComponentScan)
本文内容基于:【Java从0到架构师】Spring - 注解,十分重要
纯注解开发 - AOP
@EnableAspectJAutoProxy
相当于 <aop:aspectj-autoproxy>
@Aspect
@Component
@EnableAspectJAutoProxy
public class DefaultAspect {@Around("within(com.mj.domain.Person)")public Object log(ProceedingJoinPoint point) throws Throwable {System.out.println("log--------1");Object res = point.proceed();System.out.println("log--------2");return res;}
}
@EnableAspectJAutoProxy
也可以考虑写到一个单独的 @Configuration
类中
纯注解开发 AOP
纯注解开发 - 整合 MyBatis
Spring 纯注解整合 MyBatis
将参数放到配置文件中实现解耦合:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test_mybatis
jdbc.username=root
jdbc.password=rootmybatis.typeAliasesPackage=com.mj.domain
mybatis.mapperLocations=mappers/*.xml
mybatis.mapperScan=com.mj.dao
@MapperScan
相当于 MapperScannerConfigurer
@Configuration
@PropertySource("db.properties") //读取配置文件
@MapperScan("${mybatis.mapperScan}") // 配置dao文件扫描路径
public class MyBatisConfig {@Value("${jdbc.driverClassName}")private String driverClassName;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Value("${mybatis.typeAliasesPackage}")private String typeAliasesPackage;@Value("${mybatis.mapperLocations}")private String mapperLocations;// 创建dataSource对象@Beanpublic DataSource dataSource() {DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driverClassName);ds.setUrl(url);ds.setUsername(username);ds.setPassword(password);return ds;}// 创建SqlSessionFactoryBean对象@Beanpublic SqlSessionFactoryBean sqlSessionFactory() throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource());bean.setTypeAliasesPackage(typeAliasesPackage);// 配置映射文件的位置 ---> mappers/*.xmlPathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();bean.setMapperLocations(resolver.getResources(mapperLocations));return bean;}// Spring会自动找到SqlSessionFactoryBean对象, 下面的代码可以不写
// @Bean
// public MapperScannerConfigurer configurer() {// MapperScannerConfigurer configurer = new MapperScannerConfigurer();
// configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
// configurer.setBasePackage("com.mj.dao");
// return configurer;
// }
}
纯注解开发 - 事务管理
Spring 纯注解整合事务管理
@EnableTransactionManagement
相当于 <tx:annotation-driven>
@Configuration
@EnableTransactionManagement
public class TxConfig {@Beanpublic DataSourceTransactionManager mgr(DataSource dataSource) {DataSourceTransactionManager mgr = new DataSourceTransactionManager();mgr.setDataSource(dataSource);return mgr;}
}
JSR 注解
JSR 是 Java Specification Requests 的缩写,译为 Java规范提案
JSR 是指向 JCP (Java Community Process) 提出新增一个标准化技术规范的正式请求
- 任何人都可以提交 JSR,以向 Java 平台增添新的 API 和服务
- 一旦某个 JSR 通过了 JCP 的审核,它就变成了 Java 技术栈的一部分,可以安全地用于生产环境
- JSR 的审核过程确保了只有可靠稳定的技术才能变成 Java 的一部分,避免过度臃肿和膨胀
Spring 也支持 JSR 规范中定义的一些注解:
- JSR 250:
@Resource
- JSR 330:
@Inject
- JSR 520:
@PostConstruct
、@PreDestroy
导入 JSR 注解的依赖:
<!-- JSR注解 -->
<!-- @Resource、@PostConstruct、@PreDestroy -->
<dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version>
</dependency><!-- @Inject -->
<dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version>
</dependency>
JSR 注解 - @Resource、@Inject
@Resource
:根据名称进行注入,可以用在成员变量、setter 上
- 下面三种写法等价:
@Resource(name="dog")
@Autowired
@Qualifier("dog")
@Inject
:默认根据类型进行注入,可以用在成员变量、setter、构造方法上
- 可以配合使用
@Qualifier
、@Name
:设置需要注入的 bean 的 id
@Inject
public Student(@Value("MJ666") String name,@Named("dog") Dog dog) {this.name = name;this.dog = dog;System.out.println("Student");
}
JSR 注解 - @PostConstruct、@PreDestroy
结合 【Java从0到架构师】Spring - 生命周期、代理 相关内容
@PostConstruct
:在 InitializingBean 的 afterPropertiesSet 方法之前调用
@PreDestroy
:在 DisableBean 的 destroy 方法之前调用
@PreDestroy
public void preDestroy() {}
@PostConstruct
public void postConstruct() {}
property-placeholder 的底层
它的底层是使用了 PropertySourcePlaceholderConfigurer 类
- 可以使用这个类,取代 <context:property-placeholder>、
@PropertySources
、@PropertySource
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">--><property name="location" value="db.properties"/>
</bean>
@Configuration
public class PropConfig {@Beanpublic PropertySourcesPlaceholderConfigurer configurer() {PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();configurer.setLocation(new ClassPathResource("db.properties"));return configurer;}
}
property-placeholder 示例
component-scan 详解
exclude-filter:设置不需要扫描的类型
<context:component-scan base-package="com.mj"><context:exclude-filter type="assignable" expression="com.mj.domain.Dog"/><context:exclude-filter type="assignable" expression="com.mj.domain.Person"/>
</context:component-scan>
include-filter:设置需要扫描的类型
<context:component-scan base-package="com.mj" use-default-filters="false"><context:include-filter type="assignable" expression="com.mj.domain.Dog"/><context:include-filter type="assignable" expression="com.mj.domain.Person"/>
</context:component-scan>
被 include-filter 包含的类型,就算没有 @Component
、<bean>、@Bean
修饰,也会放到 IoC 容器中
关于 exclude-filter、include-filter 的 type 属性值,决定了 expression 属性可以设置什么值
- assignable:设置具体类型
- annotation:设置注解类型
- aspectj:设置切入点表达式 within 中的内容
- regex:设置正则表达式,比如
.*service.*
表示全类中包含 service 的 - custom 设置自定义类型过滤器(实现 org.springframework.core.type.filter.TypeFilter)
component-scan 示例
【Java从0到架构师】Spring - 纯注解开发相关推荐
- 【Java从0到架构师】SSM 整合(XML、纯注解)
SSM 整合 父子容器 父子容器的配置文件建议 子容器的加载创建 父容器的加载创建 MyBatis 补充 mybatis-config.xml Maven 补充 SSM 整合 - 纯注解 Initia ...
- 【Java从0到架构师】Spring - 注解
注解 读取多个配置文件 注解实现 bean 标签 - @Component.@Component-scan 注解实现注入 - @Autowired.@Value.@PropertySource 注解实 ...
- 【Java从0到架构师】Spring - 事务管理
事务管理 声明式事务 propagation - 设置事务传播行为 read-only - 告诉数据库该事务只读 timeout - 超时抛出异常 rollback-for.no-rollback-f ...
- 【Java从0到架构师】Spring - AOP
AOP AOP 编程使用 AOP - MethodBeforeAdvice AOP - MethodInterceptor AOP - 动态代理的底层实现 AOP - 切入点表达式 AOP - 目标方 ...
- 【Java从0到架构师】Spring - 生命周期、代理
生命周期.代理 bean 的生命周期 代理 业务层的一些问题 静态代理 (Static Proxy) 动态代理 (Dynamic Proxy) JDK 动态代理 - Proxy.newProxyIns ...
- 【Java从0到架构师】Spring - 整合 MyBatis
整合 MyBatis 整合 MyBatis - 依赖 整合 MyBatis - 数据源 整合 MyBatis - SqlSessionFactoryBean 整合 MyBatis - MapperSc ...
- 【Java从0到架构师】Spring - 复杂对象、Converter
复杂对象.Converter 创建过程比较复杂的对象 实例工厂 静态工厂 FactroyBean 引入外部配置文件 SpEL表达式 scope - 控制 bean 是否单例 Converter Spr ...
- 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...
- 【Java从0到架构师】JDBC、Spring JDBC、JUnit
JDBC 下载 MySQL 的 JDBC 实现(jar,驱动包) JDBC 使用 Statement 的常用 API ResultSet 的常用 API PreparedStatement 配置文件 ...
最新文章
- 疯了疯了!面试官问一个 TCP 连接可以发多少个 HTTP 请求?
- Android开发中怎样调用系统Email发送邮件(多种调用方式)
- EndNote 20.1 for Win/MacOS 完美稳定版安装 重大更新,修复BUG听取用户反馈更易用
- 委托又给我惹麻烦了————记委托链的取消注册、获取返回值
- iOS7应用开发4、Foundation框架
- python考试题目及答案-python面试真实笔试题,带答案(1-10题)
- verilog 中if....else语句以及case语句详细理解
- 暨南大学锐捷校园网路由器教程
- 通过云主机实现双十一淘宝,京东秒杀 之一
- 【英语阅读】纽约时报 | “流浪作家”三毛:撒哈拉、爱情和死亡
- Android自定义SwitchButton左右滑动开关按钮控件
- 2020-06-12
- wxpython 和 pyQt 的选择
- THREEJS - 旋转中心调整
- 成都c语言编程培训机构,成都学c语言编程,成都学c语言编程去哪里,成都学c语言编程需要报培训班吗...
- photoshop去掉图片白边的方法
- vs中c语言图形显示出来,VS2010+Opencv+MFC读取图像和视频显示在Picture控件
- 小学生图解排序算法:③直接插入排序
- Oracle 数据库登录详解
- 简单的组织人事小程序设计
热门文章
- 设置darktable为中文
- sql nolock_SQL Server NOLOCK和最佳优化
- sql server序列_SQL Server中的序列对象功能
- SQL Server 2016的新功能–动态数据屏蔽
- collector_使用Data Collector进行SQL Server性能监视–第3部分–阅读报告
- 想入职阿里的Java开发者必看,阿里巴巴面试官实战经验分享!
- react项目开发入门
- 读取配置文件(configparser,.ini文件)
- JS新手入门自学笔记
- 使用Spark分析拉勾网招聘信息(四): 几个常用的脚本与图片分析结果