Spring开发步骤
1.导入spring开发的基本包坐标
2.编写Dao接口和实现类
3.创建spring核心配置文件
4.在spring配置文件中配置UserDaoImpl
5.使用spring的API获取Bean实例
Spring配置文件
1. Bean标签
1.1 调用无参
用于配置对象交由Sprig来创建,默认情况调用无参构造,没有无参构造则不能创建成功
1.2 基本属性
id: Bean实例在spring容器中的唯一标识 class:Bean的全限定名
1.3 Bean标签范围配置
singleton在加载配置文件的时候就会实例化对象(饿汉式)容器在对象再容器毁对象毁
prototype在每次getBean的时候实例化对象 ,只要对象在使用中,就一直活着,当对象长时间不用时,被java的垃圾回收器回收了
1.4Bean生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
在测试类中要手动关闭容器,ApplicationContext是接口他的子类ClassPathXmlApplicationContext才有close方法所以要强转
2. Bean实例化三种方式
无参构造方法实例化
工厂静态方法实例化(静态方法不需要实例化可以用类名直接调用)
工厂实例方法实例化(要实例化才可以调用因为不是静态方法)
3. Bean的依赖注入分析
4. Bean的依赖注入概念
5. Bean的依赖注入方式(引用注入)
5.1 构造方法
5.2 set方法
5.2.1 原始方法
5.2.2 简便方法 P命名空间
6. Bean的依赖注入(普通属性)
7. Bean的依赖注入(集合属性)
8. 引入其他配置文件(分模块开发)
***spring的重点配置
Spring相关API
ApplicatioContext实现类
getBean()方法使用
1.源代码
2.具体使用
Spring配置数据源
1. 数据源的手动创建
package com.txy.test;
import com.alibaba.druid.pool.DruidDataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.util.ResourceBundle;
public class DataSourceTest {
@Test
//测试手动创建c3p0数据源
public void test1() throws Exception {
//获取数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/votes?useUnicode=true&characterEncoding=utf-8");
dataSource.setUser("root");
dataSource.setPassword("root");
//获取数据
Connection connection = dataSource.getConnection();
System.out.println(connection);
//关闭
connection.close();
}
@Test
//测试手动创建druid数据源
public void test2() throws Exception {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/votes?useUnicode=true&characterEncoding=utf-8");
dataSource.setUsername("root");
dataSource.setPassword("root");
//获取数据
Connection connection = dataSource.getConnection();
System.out.println(connection);
//关闭
connection.close();
}
@Test
//测试手动创建c3p0数据源(加载properties配置文件【properties配置文件是为了解耦合】)
public void test3() throws Exception {
//读取配置文件
ResourceBundle rb = ResourceBundle.getBundle("jdbc");//这个参数是填相对加载是的路径也就是resource下的路径并且不用写扩展名
String driver = rb.getString("jdbc.driver");
String url = rb.getString("jdbc.url");
String username = rb.getString("jdbc.username");
String password = rb.getString("jdbc.password");
//创建数据源对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser("root");
dataSource.setPassword(password);
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
}
2. spring配置数据源
3. 抽取jdbc配置文件
applicationContext.xml加载jdbc.properties配置文件获得链接信息(为了解耦合)
Spring注解开发
1. spring原始注解
Spring原始注解主要是替代的配置
使用注解方式可以不用写set方法
引用类型注入如下
普通类型注入
2. spring新注解
使用原始注解不能全部代替xml配置文件,还需要使用注解代替的配置如下
非自定义的Bean的配置:< bean >
加载properties文件的配置:< context:property-placeholder >
组件扫描的配置:< context:component-scan >
引入其他文件:< import >
新注解
Spring集成Junit
1. 原始Junit测试Spring的问题
2. 解决思路
3. Spring集成Junit步骤
Spring AOP
1. AOP的作用及其优势
作用:在程序运行期间,在不修改源代码的情况下对方法进行功能增强
优势:减少重复代码,提高开发效率,并且便于维护
2. AOP的底层实现
3. 动态代理技术
4. AOP相关概念
5. AOP开发明确的事项
5.1 需要编写的内容
- 编写核心业务代码(目标类的目标方法)
- 编写切面类,切面类中有通知(增强功能方法)
- 在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合
5.2 AOP技术实现的内容
Spring框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类型,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行
5.3 AOP底层使用哪种代理方式
在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理方式。
6. 知识要点
7. 基于XML的AOP开发
1. 切点表达式的写法
表达式语法:execution([修饰符]返回值类型 包名.类名.方法名(参数))
[里可写可不写]
返回值类型、包名、类名、方法名可以使用星号*代表任意
包名与类名之间一个点.代表当前包下的类 两个点…表示当前包及其子包下的类
参数列表可以使用两个点…表示任意个数,任意类型的参数列表
2. 通知的类型
3. 切点表达式的抽取
4. 具体代码实现
结构:
目标接口:
package com.txy.aop;
public interface TargetInterface {
public void save();
}
目标类:
package com.txy.aop;
public class Target implements TargetInterface {
public void save() {
//int i=1/0;
System.out.println("save txy save save hey running....................");
}
}
切面类:
package com.txy.aop;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect {
public void before(){
System.out.println("这是前置增强方法,天天在家当废物,微笑");
}
public void afterreturning(){
System.out.println("后置增强...........fdaf..............");
}
//ProceedingJoinPoint:正在执行的连接点==切点
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前增强····");
Object proceed = pjp.proceed();//切点方法
System.out.println("环绕后增强····");
return proceed;
}
public void afterThrowing(){
System.out.println("异常抛出增强·····");
}
//最终通知不管怎样最后都会执行
public void after(){
System.out.println("最终增强····");
}
}
配置文件:
目标接口
8. 基于注解的AOP开发
1. 快速入门
目标接口:
package com.txy.anno;
public interface TargetInterface {
public void save();
}
目标类:
package com.txy.anno;
import org.springframework.stereotype.Component;
@Component("target")
public class Target implements TargetInterface {
public void save() {
//int i=1/0;
System.out.println("save txy save save hey running....................");
}
}
切面类:
配置文件:
2. 注解配置AOP详解
1. 注解通知的类型
通知的配置语法:@通知注解(“切点表达式”)
2. 切点表达式的抽取
3. 知识要点
Spring的事务控制
1. 编程式事务控制相关对象(了解即可)
1.1 PlatformTransactionManager
1.2 TransactionDefinition
- 事务隔离级别
- 事务传播行为
- TransactionStatus
2. 基于XML
2.1 声明式事务控制的实现
-
声明式事务控制明确事项:
谁是切点? 谁是通知? 配置切面?
注:
3. 基于注解
Spring 集成web环境
1. ApplicationContext应用上下文获取方式
1.1 前提
1.2 spring集成web环境步骤
自己写:
listener-class应该要用自己写的类的路径,这里是spring框架提供的路径
红框为了解开applicationContext.xml名字的耦合
蓝色的框是为了解开app字符串的耦合
spring提供的方式:
配置文件:
Controller
img-mWwx52vc-1614756558644)]
1.2 spring集成web环境步骤
[外链图片转存中…(img-exU8rzg8-1614756558647)]
自己写:
[外链图片转存中…(img-S1OJySSa-1614756558650)]
[外链图片转存中…(img-19b05HIZ-1614756558653)]
listener-class应该要用自己写的类的路径,这里是spring框架提供的路径
[外链图片转存中…(img-vLyfPsts-1614756558665)]
红框为了解开applicationContext.xml名字的耦合
[外链图片转存中…(img-x9uw7lt3-1614756558668)]
[外链图片转存中…(img-10kwARbe-1614756558669)]
[外链图片转存中…(img-WsEJHhT5-1614756558671)]
蓝色的框是为了解开app字符串的耦合
spring提供的方式:
配置文件:
[外链图片转存中…(img-mVGYsG6n-1614756558674)]
Controller