纯注解开发

  • 纯注解开发 - 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 - 纯注解开发相关推荐

  1. 【Java从0到架构师】SSM 整合(XML、纯注解)

    SSM 整合 父子容器 父子容器的配置文件建议 子容器的加载创建 父容器的加载创建 MyBatis 补充 mybatis-config.xml Maven 补充 SSM 整合 - 纯注解 Initia ...

  2. 【Java从0到架构师】Spring - 注解

    注解 读取多个配置文件 注解实现 bean 标签 - @Component.@Component-scan 注解实现注入 - @Autowired.@Value.@PropertySource 注解实 ...

  3. 【Java从0到架构师】Spring - 事务管理

    事务管理 声明式事务 propagation - 设置事务传播行为 read-only - 告诉数据库该事务只读 timeout - 超时抛出异常 rollback-for.no-rollback-f ...

  4. 【Java从0到架构师】Spring - AOP

    AOP AOP 编程使用 AOP - MethodBeforeAdvice AOP - MethodInterceptor AOP - 动态代理的底层实现 AOP - 切入点表达式 AOP - 目标方 ...

  5. 【Java从0到架构师】Spring - 生命周期、代理

    生命周期.代理 bean 的生命周期 代理 业务层的一些问题 静态代理 (Static Proxy) 动态代理 (Dynamic Proxy) JDK 动态代理 - Proxy.newProxyIns ...

  6. 【Java从0到架构师】Spring - 整合 MyBatis

    整合 MyBatis 整合 MyBatis - 依赖 整合 MyBatis - 数据源 整合 MyBatis - SqlSessionFactoryBean 整合 MyBatis - MapperSc ...

  7. 【Java从0到架构师】Spring - 复杂对象、Converter

    复杂对象.Converter 创建过程比较复杂的对象 实例工厂 静态工厂 FactroyBean 引入外部配置文件 SpEL表达式 scope - 控制 bean 是否单例 Converter Spr ...

  8. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入

    IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...

  9. 【Java从0到架构师】JDBC、Spring JDBC、JUnit

    JDBC 下载 MySQL 的 JDBC 实现(jar,驱动包) JDBC 使用 Statement 的常用 API ResultSet 的常用 API PreparedStatement 配置文件 ...

最新文章

  1. 疯了疯了!面试官问一个 TCP 连接可以发多少个 HTTP 请求?
  2. Android开发中怎样调用系统Email发送邮件(多种调用方式)
  3. EndNote 20.1 for Win/MacOS 完美稳定版安装 重大更新,修复BUG听取用户反馈更易用
  4. 委托又给我惹麻烦了————记委托链的取消注册、获取返回值
  5. iOS7应用开发4、Foundation框架
  6. python考试题目及答案-python面试真实笔试题,带答案(1-10题)
  7. verilog 中if....else语句以及case语句详细理解
  8. 暨南大学锐捷校园网路由器教程
  9. 通过云主机实现双十一淘宝,京东秒杀 之一
  10. 【英语阅读】纽约时报 | “流浪作家”三毛:撒哈拉、爱情和死亡
  11. Android自定义SwitchButton左右滑动开关按钮控件
  12. 2020-06-12
  13. wxpython 和 pyQt 的选择
  14. THREEJS - 旋转中心调整
  15. 成都c语言编程培训机构,成都学c语言编程,成都学c语言编程去哪里,成都学c语言编程需要报培训班吗...
  16. photoshop去掉图片白边的方法
  17. vs中c语言图形显示出来,VS2010+Opencv+MFC读取图像和视频显示在Picture控件
  18. 小学生图解排序算法:③直接插入排序
  19. Oracle 数据库登录详解
  20. 简单的组织人事小程序设计

热门文章

  1. 设置darktable为中文
  2. sql nolock_SQL Server NOLOCK和最佳优化
  3. sql server序列_SQL Server中的序列对象功能
  4. SQL Server 2016的新功能–动态数据屏蔽
  5. collector_使用Data Collector进行SQL Server性能监视–第3部分–阅读报告
  6. 想入职阿里的Java开发者必看,阿里巴巴面试官实战经验分享!
  7. react项目开发入门
  8. 读取配置文件(configparser,.ini文件)
  9. JS新手入门自学笔记
  10. 使用Spark分析拉勾网招聘信息(四): 几个常用的脚本与图片分析结果