Spring ---轻量级的DI/IOC与AOP的容器框架~
DI(依赖注入)/IOC(控制反转)
导包
【spring-core】4.1.2--核心包
【spring-context】4.1.2--文支持包
【spring-aop】4.1.2--切面 包
【spring-text】4.1.2--测试包
【junit】4.12--测试包
【aspect jweaver】1.8.8--织入包(使用springAOP必须导的包)
<dependencies>
<!--切面包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<!--核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<!--上线文支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<!--测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--织入包(使用SpringAOP必须导的包)-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
<!--测试包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
</dependencies>
<!--当src/java/main扫描不到xml时导的包-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/test/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
name--名称
<bean id="myBean" class="cn.zx._01reviw.MyBean">
<constructor-arg name="name" value="嘿嘿"/>
<constructor-arg name="age" value="12"/>
</bean>
index--索引
<bean id="myBean" class="cn.zx._01reviw.MyBean">
<constructor-arg index="0" value="呦呦"/>
<constructor-arg index="1" value="11"/>
</bean>
type--类型
<bean id="myBean" class="cn.zx._01reviw.MyBean">
<constructor-arg type="java.lang.String" value="哈哈"/>
<constructor-arg type="java.lang.Integer" value="10"/>
</bean>
什么都没有
<bean id="myBean" class="cn.zx._01reviw.MyBean">
<constructor-arg value="张老板"/>
<constructor-arg value="16"/>
</bean>
外部bean
<bean id="OtherBean" class="cn.zx._01reviw.OtherBean"/>
<bean id="myBean" class="cn.zx._01reviw.MyBean">
<constructor-arg value="张大仙"/>
<constructor-arg value="12"/>
<constructor-arg ref="OtherBean"/>
</bean>
image.png
内部bean
<bean id="myBean" class="cn.zx._01reviw.MyBean">
<constructor-arg value="是"/>
<constructor-arg value="12"/>
<constructor-arg>
<bean class="cn.zx._01reviw.OtherBean"/>
</constructor-arg>
</bean>
image.png
外部bean可以无限调用【全局】
内部bean 只能内部自己用【局部】
特殊
// 简单属性
private Long id;
private String name;
private Boolean sex;
private BigDecimal salary;
// 对象属性
private List<OtherBean> otherBeanList;
private Set<String> set;
private Set<OtherBean> otherBeanSet;
//下面这个是重点
private Properties props1;
private Properties props2;
private String[] arrays;
private List<String> list;
<bean id="otherBean" class="cn.zx._02demo.OtherBean"/>
<bean id="myBean" class="cn.zx._02demo.MyBean">
<property name="id" value="12"/>
<property name="name" value="张大仙"/>
<property name="sex" value="true"/>
<property name="salary" value="21"/>
<!--List-->
<property name="list">
<list>
<value>嘿嘿</value>
<value>哈哈</value>
<value>呦呦</value>
<value>呦呦</value>
</list>
</property>
<!--set-->
<property name="set">
<set>
<value>嘿嘿</value>
<value>哈哈</value>
<value>呦呦</value>
<value>呦呦</value>
</set>
</property>
<!--otherBean-->
<property name="otherBeanList">
<list>
<bean class="cn.zx._02demo.OtherBean"/>
<bean class="cn.zx._02demo.OtherBean"/>
<ref bean="otherBean"/>
<ref bean="otherBean"/>
</list>
</property>
<!--set<OtherBean>-->
<property name="otherBeanSet">
<set>
<bean class="cn.zx._02demo.OtherBean"/>
<bean class="cn.zx._02demo.OtherBean"/>
<ref bean="otherBean"/>
<ref bean="otherBean"/>
</set>
</property>
<!--数组-->
<property name="arrays">
<array>
<value>红中</value>
<value>北风</value>
<value>幺鸡</value>
<value>白板</value>
</array>
</property>
<!--props1(支持中文)-->
<property name="props1">
<props>
<prop key="qqq">
sss
</prop>
<prop key="eee">
lslsls
</prop>
<prop key="rrr">
12zhong是
</prop>
</props>
</property>
<!--props2(不支持中文)-->
<property name="props2">
<value>dirverClass=mysql.com.xxurl=mysql:///ahahusername=root中文 </value>
</property>
</bean>
</beans>
image.png
代理模式
1.静态代理:和装饰者模式一模一样。 用这个实现AOP反而越来越复杂。
2.动态代理:我们实现AOP就是通过动态代理 ,因为他强
Spring中的AOP是使用动态代理模式完成的!!!
使用动态代理的方法(是它自己控制使用哪个方案,不是我们控制的)
一:JDK原生方案【只支持拥有接口的类,最规范,原生的】
二:CGLIB -- CG嘞贝【支持没有接口的类,也支持有接口的二类】第三方jar包
spring中AOP是面向编程的技术,底层是运用的动态代理,使用的两种方案,一种是原生的JDK,这个最规范的,支持有接口的类,还有一种是第三方jar包 CGLIB都支持有没有接口 ,但是都是用JDK。最规范点
AOP(面向切面编程)
image.png1.xml中创建了 要再添加aop命名空间
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
2.service配置和事务管理器
<!--service配置-->
<bean id="employeeService" class="cn.zx._05xmlaop.service.Impl.EmployeeServiceImpl"/>
<!--事务管理器-->
<bean id="txManager" class="cn.zx._05xmlaop.TxManager"/>
环绕通知
用了环绕,就不需要用另外几个通知了(这个会重复)。如果是两个以上的通知,建议使用环绕
<aop:config>
<!--切点 -->
<aop:pointcut id="pointcut" expression="execution(* cn.zx._05xmlaop.service.I*Service.*(..))"/>
<!--环绕通知-->
<aop:aspect ref="txManager">
<aop:around method="around" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
TxManager
package cn.zx._05xmlaop;
import org.aspectj.lang.ProceedingJoinPoint;
public class TxManager {//事务管理器
public void begin(){
System.out.println("开始事务");
}
public void commit(){
System.out.println("提交事务");
}
public void rollback(Throwable e){
System.out.println("回滚事务"+ "错误原因:"+e.getMessage());
}
public void close(){
System.out.println("关闭事务");
}
//环绕通知
public void around(ProceedingJoinPoint joinPoint){
try {
begin();
joinPoint.proceed();
commit();
} catch (Throwable e) {
rollback(e);
//e.printStackTrace();
} finally {
close();
}
}
}
SpringTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class SpringTest {
@Autowired//注入
private IEmployeeService employeeService;
@Test
public void test() throws Exception{
// System.out.println(employeeService);
employeeService.save();
}
}
IEmployeeService
public interface IEmployeeService {
void save();
}
EmployeeServiceImpl
public class EmployeeServiceImpl implements IEmployeeService{
public void save() {
System.out.println("我就是真正的任务");
//int i = 1/0;//搞一个错误的 看看回滚事务
}
}
运行结果
运行成功--提交了事务
有报错信息
image.png
全注解(重)
SpringTest-Context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--扫描对应的包-->
<context:component-scan base-package="cn.zx._09xxx"/>
<!--支持AOP的注解-->
<aop:aspectj-autoproxy/>
</beans>
TxManager 事务管理器
@Component
@Aspect
//@Aspect 就等于 <aop:aspect ref="txManager">
public class TxManager {
//配置切点 相当于<aop:pointcut id="pointcut" expression="execution(* cn.zx._05xmlaop.service.I*Service.*(..))"/>
@Pointcut("execution(* cn.zx._09xxx.service.I*Service.*(..))")
public void pointcut(){}
//前置通知 @Before("pointcut()")
//@Before("pointcut()")
public void begin(){
System.out.println("开启事务");
}
//@AfterReturning("pointcut()")
public void commit(){
System.out.println("提交事务");
}
//异常通知
//@AfterThrowing(value = "pointcut()" ,throwing = "throwable")
public void rollback(Throwable throwable){
System.out.println("回滚事务"+"错误原因:"+throwable.getMessage());
}
//@After("pointcut()")
public void close(){
System.out.println("关闭事务");
}
@Around("pointcut()")
public void around(ProceedingJoinPoint joinPoint){
try {
begin();
joinPoint.proceed();
commit();
} catch (Throwable throwable) {
rollback(throwable);
throwable.printStackTrace();
} finally {
close();
}
}
}
其他基本不变
image.png
扫描注解
@service:业务层
@Controller:控制层 --- 根据指定的名称找到对应的bean
@Repository:持久层(仓库)---把当前这个类交给spring管理,把你搞成一个bean
@Component:组件(不在那三层中 用这个)
@Autowired注入
@Resource 和@Autowired一样
@Resource(name = "")----相当于@Qualifier + @Autowired
@Qualifier:限定名称("")---根据指定的名称找到相应的bean
@Runwith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Qualifier(" ") -- 限定名称(根据指定的名称去找到对应的bean)
单词
arg--参数
type--类型
constructor-arg【配置构造器的参数】
ref--引用/引用的值
property--属性
anno--注解
single -- 单个
网友评论