一.Spring核心容器
1.IoC反转控制和DI依赖注入
2.容器和Bean获取
3.Bean基本配置
(1)基础配置
(2)别名
多个别名都可以访问到Bean
(3)作用范围---单例和非单例
a. scope标签:singleton(默认单例), prototype
b.单例存在的原因是很多情况下都是调用某个类中的成员方法,只创建一个类即可满足需求且效率更高
c.
4.Bean的实例化
(1)调用无参的构造方法---反射
(2)静态工厂
(3)实例工厂---FactoryBean
5.Bean的生命周期
(1)控制生命周期
a.自己写init和destory方法,然后配置init-method和destroy-method
b.实现接口
(2)关闭容器
a.接口实现类的close()
b.钩子设置 registerShutdownHook()
6.依赖注入的方式
a.引用数据类型---ref
b.基本数据类型---val
(1)setter---property 标签
在类中写setter方法赋值
(2)静态工厂--- constructor-arg 标签
在类中写构造方法赋值
---依赖注入方式的选择
7.依赖自动注入
在bean标签中设置autowire属性---byType,byName
8.集合注入
五种集合注入的书写形式
9.加载properties文件:
(1)加载步骤
a.开启context命名空间
b.加载配置文件
c.使用占位符读取数据---${}
(2)加载properties文件的方式
10.容器
(1)加载配置文件的方式
(2)获取Bean的三种方式
(3)容器类的层次结构
11.总结:
(1)容器相关
(2)Bean相关
(3)依赖注入
二.注解开发
1.注解开发定义Bean
(1)步骤
a.在bean的类中添加注解@Component
b.配置文件中设置包扫描
<context:component-scan base-package="dao"/>
(2)衍生注解
2.纯注解开发
(1)定义配置类添加注解
(包扫描中如果是多个包采用{“aaa”,“bbb”数组的形式传入)
(2)获取Bean时使用AnnotationConfigApplicationContext的实体类,参数为配置类的class
3.注解配置Bean
(1)作用范围
(2)生命周期
高版本jdk无此注解,需要导入依赖
<artifactId>javax.annotation-api</artifactId>
4.注解依赖注入
(1)自动装配--->@Autowired,按类型匹配
(2)多个同类型Bean--->@Qualifier,按名匹配
(3)基本数据类型--->@Value
(4)读取properties文件--->配置类中@PropertySource("aaa"),占位符取值
5.管理第三方Bean
(1)创建一个第三方Bean的管理类,其中有一个方法返回目标Bean,且需要添加@Bean
(2)在容器配置文件中使用@Import导入Bean的管理类
(3)第三方Bean的依赖注入
a.基本类型---成员变量使用@Value赋值后传入
b.引用类型---形参加参数,容器自动按类型装配
6.注解开发总结
三.Spring整合MyBatis(+Druid)
1.导入Spring和mybatis相关的两个依赖
<!-- spring操作数据库的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!-- spring整合mybatis的包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
2.注解方式创建配置类,完成DruidSource的配置---后续mybatis中需要配置一个DataSource的参数
@Configuration//表示这是容器配置类
@ComponentScan("com.dongnan")//扫描Bean,此处是service中有BrandDervice需要被容器管理
@PropertySource("jdbc.properties")//加载配置文件
@Import({jdbcConfig.class,MybatisConfig.class})//将第三方管理获取的bean加入容器
public class SpringConfig {
}
public class jdbcConfig {
public DataSource dataSource;
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource() {
System.out.println(driver);
System.out.println(url);
System.out.println(username);
System.out.println(password);
DruidDataSource datasource = new DruidDataSource();
datasource.setDriverClassName(driver);
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);
return datasource;
}
}
3.完成MyBatis配置类---包括返回
public class MybatisConfig {
//定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource ds) {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setTypeAliasesPackage("com.dongnan.dao");//取别名
bean.setDataSource(ds);//DataSource中包含了主体信息
return bean;
}
//定义bean,返回MapperScannerConfigurer对象
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.dongnan.dao"); //Mapper扫描
return msc;
}
}
注:
a.Mapper扫描类也记得添加@Bean
b.完成MyBatisConfig配置后要在SpringConfig中导入
四.AOP
1.aop功能和基本概念
(1)无侵入式的实现代码的功能性增强
(2)
a.连接点:Spring中是一个方法
b.切入点:用来匹配一个具体的方法或多个方法
c.通知:一个定义了共性功能的方法,存放在通知类中
d.切面:绑定一个通知和一个切入点
2.aop实现
(1)导入依赖坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
(2)定义连接点方法
(3)定义通知类和通知
(4)定义切入点
需要写pt()方法,然后加注解指明切入点的位置
(5)设置切面
设置两个注解来加入容器和表明这是aop切面,同时绑定切入点和通知
@Component
@Aspect
public class Advice {
@Pointcut("execution(void com.dongnan.dao.BookDaoImpl.b())")//指定切入点
private void pt(){}
@Before("pt()")//设置切面
public void method(){
System.out.println("功能增强");
}
}
(6)在配置类中添加表明注解开发的注解
@Configuration
@ComponentScan("com.dongnan")
@EnableAspectJAutoProxy//声明注解开发
public class SpringConfig {
}
3.AOP工作流程
(1)SpringAOP本质---代理模式
(2)两个AOP核心概念
目标对象,代理对象
(3)工作流程
4.AOP切入点表达式
5.AOP通知类型
...
Around:
6.AOP获取参数数据
7.处理空格的功能实例
五.事务管理
1.实现
(1)给需要事务管理的类的接口添加注解
(2)在jdbc的config.class中配置事务管理器
//配置事务管理器,mybatis使用的是jdbc事务
@Bean
public PlatformTransactionManager transactionManager(DataSource ds) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(ds);
return dataSourceTransactionManager;
}
(3)配置类中开启注解式事务驱动
2.Spring事务角色
3.事务属性
只有在ERROR和运行时异常才会回滚,其他异常则需要自己设置
4.事务传播行为
用于将不同的事务调度员交由不同的事务管理员管理,实现事务的隔离,例如银行转账成与否都要添加日志,则转账事务和添加日志事务隔离