Spring是一款轻量级的非侵入式的IOC和AOP的一站式的java开发框架,为简化企业级应用开发而生
轻量级:Spring框架使用的jar包很小,运行时占用的资源少,效率高
非侵入式的:业务代码不需要实现或继承Spring框架中的类或接口
IOC: Inversion of Control,控制反转
AOP:面向切面
一站式框架:提供核心功能,主要是IOC,创建管理对象,
提供面向切面编程,增强程序扩展
对数据访问层进行了封装(重点在于事务管理)
对web层进行封装,使得请求更加便捷
Spring可以用来管理对象,可以把Spring认为是一个容器。
scope默认值是singleton(单例的),在整个应用程序中只创建一个对象,在Spring框架启动时就创建成功
prototype(原型的),每次获取时创建一个对象,可以创建多个
<bean id="admin" name="admin2" class="com.ffyc.spring.model.Admin" scope="prototype">
<property name="id" value="10">property>
<constructor-arg name="account" value="100">constructor-arg>
bean>
Spring在创建对象(控制反转)时,还需要为我们的对象属性进行初始化赋值,这个过程被称为依赖注入
赋值的方式有两种:
1.属性赋值 get set方法
2.构造方法赋值
依赖注入的实现:
1.开启注解扫描
<context:component-scan base-package="包名"> context:component-scan>
2.创建注解对象
在需要创建对象的类上加注解,可以实现创建对象的功能
创建对象的注解有 @Component 、@Service、@Repository
@Compoent注解在model包中的类上使用
@Service注解在service包中的类上使用
@Repository注解在数据访问层中的类上使用
@Scope(value=“prototype”)
3.注入属性
注入属性使用@Autowired注解,它可以实现自动注入,是Spring提供的
@Autowired注解有两种方式来查找对象:
1.byType 去Spring容器中根据类型查找,@Autowired注解默认使用byType
2.byName 通过名称查找 需要结合@Qualifier(value=“adminDao”)来使用
@Autowired
AdminDao adminDao;
JDK 注解@Resource 自动注入
JDK 中的@Resource 注解,也可以实现自动注入
1.byType 去Spring容器中根据类型查找,@Resource
2.byName 通过名称查找 @Resource(name=“adminDao”)
Spring自身也提供了控制层的SpringMVC和持久层的Spring jdbcTemplate
Spring框架中JDBC的功能:jdbc的封装、ioc的实际应用
1.导入依赖
导入jdbc、mysql、阿里巴巴提供的数据源组件
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.2.2.RELEASEversion>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.1.10version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.16version>
dependency>
数据源组件:封装了连接数据库,数据连接池功能。
常用的数据库连接池组件:dbcp、c3p0
2.导入属性文件
<context:property-placeholder location="config.properties"/>
spring统一管理数据库连接对象
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${classDrvierName}">property>
<property name="url" value="${url}">property>
<property name="username" value="${uname}">property>
<property name="password" value="${pwd}">property>
<property name="initialSize" value="10">property>
<property name="minIdle" value="5">property>
<property name="maxActive" value="20">property>
bean>
3.在配置文件中创建 JdbcTemplate
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource">property>
bean>
AOP的全称是Aspect Oriented Programming,意思为面向切面编程,AOP是一种编程技巧,不是用来代替OOP的,AOP是OOP的延续,AOP可以把业务代码和非业务代码隔离起来,降低了各个部分的耦合度,提高了程序的复用性,提高了开发效率
原理:AOP将程序中的非业务代码(日志功能、提交事务、统一异常处理)提取出来,通过创建代理对象来对非业务代码进行调用。在不修改原来代码的情况下,为程序添加额外功能。
核心原理:动态代理
AOP思想不是spring框架独有的,只是spring框架引入了这一思想
基本概念:
连接点:类中可以被增强的方法,被称为连接点
切入点:类中实际被增强的方法,横切面切入的方法
通知:提取非业务的功能被称为通知,指一个切面在特定连接点要做的事
通知分为5种:前置通知 、后置通知、异常通知、最终通知、环绕通知
切面:把通知添加到切入点的整个过程被称为切面
目标:代理的目标对象(连接点,切入点所在的类)
代理对象:向目标对象时创建的代理对象
Spring中引入了AspectJ来实现AOP
AspectJ是一个基于AOP的java语言框架,它提供了强大的AOP功能,且实现方式更为便捷,而且还支持注解式开发
实现流程:
1.导入依赖
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aspectsartifactId>
<version>5.2.2.RELEASEversion>
dependency>
2.实现AspectJ
基于xml配置方式实现
<bean id="myuntil" class="com.ffyc.spring.until.MyUntil">bean>
<aop:config>
<aop:pointcut id="saveAdmin" expression="execution(* com.ffyc.spring.dao.AdminDao.save(..))"/>
<aop:aspect ref="myuntil">
<aop:before method="commit" pointcut-ref="saveAdmin" >aop:before>
<aop:after method="commit" pointcut-ref="saveAdmin">aop:after>
<aop:after-returning method="commit" pointcut-ref="saveAdmin">aop:after-returning>
<aop:after-throwing method="exception" pointcut-ref="saveAdmin" throwing="e">aop:after-throwing>
<aop:around method="aroundAdvice" pointcut-ref="saveAdmin">aop:around>
aop:aspect>
aop:config>
基于注解方式的实现
1)在xml中开启AspectJ
<aop:aspectj-autoproxy />
2)定义通知
@Component//让Srping生成对象
@Aspect//表明装有通知的类-切面
public class MyUntil {
//最终通知
@After("execution(* com.ffyc.spring.dao.AdminDao.save(..))")
public void commit(){
System.out.println("提交事务");
}
//异常通知
@AfterThrowing( value = "execution(* com.ffyc.spring.dao.AdminDao.save(..))",throwing = "e")
public void exception(Throwable e){
System.out.println("异常"+e.getMessage());
}
//环绕通知
@Around("execution(* com.ffyc.spring.dao.AdminDao.save(..))")
public void aroundAdvice(ProceedingJoinPoint point){
try {
System.out.println("前置通知");
point.proceed();
System.out.println("后置通知");
}catch (Throwable e){
e.printStackTrace();
System.out.println("异常通知"+e.getMessage());
}
System.out.println("最终通知");
}
}
数据库事务:事务可以看做是由对数据库若干操作组成的一个单元,一个事务就是一个执行单元,一个单元中可以包含多个sql
事务管理是数据库为了保证数据在运行过程中的准确性
关系型数据库事务的基本特征:
1.原子性:一次操作中的多条sql,要么都执行,要么都不执行
2.隔离性
3.持久性
4.一致性
Spring框架里面提供事务管理功能:Spring框架帮我们把提交事务的功能管理起来,封装好了
Srping中的事务管理有两种:编程式事务管理、声明式事务管理
在代码中自己写的 实际中开发中使用的少
声明式事务管理使用注解标签实现,底层实现原理是AOP的思想,是方法级别的,在执行某个方法时,为方法添加额外的事务管理功能
Spring 声明式事物管理方式有两种: 基于 xml 配置 、基于注解实现
1.配置事物管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">property>
bean>
2.开启注解事务管理
<tx:annotation-driven transaction-manager="transactionManager"/>
3.在service中添加注解标签,添加注解
@Transactional
public void save(Admin admin){
//逻辑处理
adminDao.saveAdmin(admin);
}