Spring
分层的java se/ee 应用 全栈式 轻量级开源框架
- 全栈式:对主流技术和框架进行整合,对三层架构提供了解决方案
- 轻量级:使用了多少服务,启动加载的资源多少以及耦合度等
Spring :IOC AOP 两大核心
- IOC:控制反转, 对象的创建权 交给 spring
- AOP :面向切面编程,不修改源码,对方法增强
spring优势
- 方便解耦,简化开发。
- 耦合,指对象的依赖关系,一个模块更改其他模块也需要更改。
- 解耦,降低程序间的依赖关系。配置文件+反射
- AOP编程支持
- 声明式事务的支持,通过配置
- 方便测试
- 方便集成各种框架
IOC
控制反转
控制:java对象的控制权限(对象的创建,销毁)
反转:对象的控制权限由开发者类中手动创建反转到spring容器控制
// spring上下文对象,加载的同时创建了bean对象到容器中
//aplicationContext.xml核心配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationCOntext.xml");
context.getBean("userDao");
Spring API
BeanFactory 和ApplicationContext区别
BeanFactory 第一次被调用 getBean()才会创建Bean对象
ApplicationContext 类加载的同时,创建了bean对象到容器中
BeanFactory实现类
- FileSystemXmlApplicationContext,磁盘路径,绝对路径
- ClassPathXmlApplicationContext ,类的根路径下加载
- AnnotationCOnfigApplicationContext
getBean重载方法
- getBean(String id)
- getBean(Class
requireType) - getBean(String id,Class
requireType)
spring配置文件
bean标签
scope取值:
- singleton 默认,单例,生命周期与容器相同
- prototype 多例,调用getBean()方法时才实例化
Bean生命周期
init-method 对象创建后执行 init-method
实例化方式
- 工厂静态方法
// class staticFactory 调用factroy-method
- 工厂普通方法
先生成工厂实例,再调用方法生成其他实例
DI 依赖注入
对象注入
构造方法
ref和id一致吗?
P命名空间注入
普通数据类型注入
集合数据类型注入
...
xml配置AOP
execution([修饰符] 返回类型 包名.类名.方法名(参数))
1.访问修饰符可以省略
2. 返回值类型,包名,类名,方法名可以用 *匹配
execution(* *.*.*.*())
3.包名和类名中间一个点 . 代表当前包下的类,两个点.. 代表当前包及其子包的类
execution(* *..*.*())
4. 参数列表 .. 表示任意个数,任意类型的参数
execution(* *..*.*(..))
环绕通知
public Object around(ProceedingJoinPoint pjp) {
Object processed = null;
try {
System.out.println("前置");
//切点方法执行
processed = pjb.processed();
System.out.println("后置");
} catch(Exception e) {
System.out.println("异常");
} finall {
System.out.println("最终");
}
}
AOP注解
@Component
@Aspect // 升级为切面类
public class MyAdvice {
// 配置切入点和通知
@Before("execution(* com.lagou.service.impl.AccountServiceImpl.*(..))")
public void before() {
...
}
}
/applicationContext.xml/
Spring JDBCTemplate
JDBCTemplate jdbc= new JDBCTemplate(DataSource dataSource);
int update(sql,params); //执行增、删、改语句
List query(sql,new BeanPropertyRowMapper<>(User.class)); //查询多个
T queryForObject(sql,new BeanPropertyRowMapper<>(User.class),params); //查询一个
new BeanPropertyRowMapper<>(); //实现ORM映射封装
事务
-
编程式事务
- PlatformTransactionManager接口 spring事务管理器
声明式事务
事务的传播
定义:一个业务方法被另一个方法调用,如何进行事务控制
REQUIRED
如果没有事务,就新建事务;如果已经存在事务,加入到事务中。被调用的方法必须进行事务控制
SUPPORTS
当前没有事务,以非事务进行。有事务,加入事务。当前被调用的方法有没有事务都可以执行(查询操作)
事务管理器通过读取事务定义参数进行事务管理,然后会产生一系列的事务状态。
平台事务管理器
事务通知配置
事务注解驱动配置(xml 或注解)
Spirng ApplicationContext
ServletContextListener 监听器监听web应用启动,加载Spring配置文件,创建ApplicationContext,存储到servletContext域中
ApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
Account account = (Account) webApplicationContext.getBean("account");