五、Spring
Spring是一个开源框架,它是为了解决企业应用开发的复杂性问题而创建的,Spring使用基本的JavaBean来完成组件封装。
1.使JavaEE的开发更容易、更简单
1.方便解耦,简化开发
2.AOP编程的支持
3.声明式事务的支持
4.方便程序的测试
5.方便集成各种优秀的框架
6.降低Java EE API 的使用难度

2.控制反转和依赖注入
Inversion of Control ,IOC,控制反转,通过配置文件new对象。
IOC是Spring容器的内核,AOP、声明事务等功能都是在此基础上发展衍生而来。
AOP: Aspect Oriented Programming,面向切面编程。
DI: 依赖注入。Dependency Inject,对象之间的依赖关系,通过配置文件进行关联。
3.导包
spring-beans-x.jar:JavaBean对象
spring-context-x.jar:上下文它一般指的是存放数据的地方(对象),存放数据应当有”生命周期”。
spring-core-x.jar:核心包
spring-expression-x.jar:能够解析EL表达式
commons-logging-x.jar:日志
4.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 默认单例,singleton设置是否单例 -->
<!-- 饿汉式,服务器启动就加载 -->
<bean id="user" class="cn.dlian.entities.User" singleton="false">
<property name="userName" value="张三" />
<property name="userPass" value="123456" />
<property name="email" ref="email" />
</bean>
<bean id="email" class="cn.dlian.entities.Email">
<property name="emailID" value="1" />
<property name="address" value="abc@qq.com" />
</bean>
<bean id="userManager" class="cn.dlian.entities.UserManager">
<property name="group1">
<list>
<bean class="cn.dlian.entities.User">
<property name="userName" value="张三" />
<property name="userPass" value="123456" />
</bean>
<bean class="cn.dlian.entities.User">
<property name="userName" value="李四" />
<property name="userPass" value="123456" />
</bean>
</list>
</property>
<property name="group2">
<map>
<entry>
<key><value>前台</value></key>
<bean class="cn.dlian.entities.User">
<property name="userName" value="李四" />
<property name="userPass" value="123456" />
</bean>
</entry>
</map>
</property>
</bean>
</beans>
5.测试
public class TestUser{
public static void main(String[] args){
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User)context.getBean("user");
//利用反射
User user2 = context.getBean(User.class);
System.out.println(user);
}
}
6.AOP的关键术语
切面 Aspect 切面在什么时候在什么地方增强什么功能
增强 Advice 增强的功能,也称为“通知”
连接点 Joinpoint 时机
切入点 Pointcut 位置
目标对象 Target 原有业务对象
代理对象 Proxy 使用了增强之后,创建的新对象其包含了原有对象
织入 Weaving 把增强的功能织入原有对象的过程
7.需要新添加的包
spring-aop-x.jar
spring-aspects-x.jar
aopalliance.jar 第三方库
8.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 不再使用dtd的方式来限定xml文件中的标签,而使用新型xsd来限定! -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" >
<!-- 配置原有业务对象 -->
<bean id="customer" class="cn.dlian.business.CustomerImpl" />
<!-- 配置增强对象 -->
<bean id="myAfterAdvice" class="cn.dlian.aop.MyAfterAdvice" />
<bean id="myBeforeAdvice" class="cn.dlian.aop.MyBeforeAdvice" />
<bean id="regexpAop" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
p:advice-ref="myAfterAdvice"
p:pattern=".*IPhone.*" />
<bean id="methodAop"
class="org.springframework.aop.support.NameMatchMethodPointcutAdivsor"
p:mappedNames="buyIPhone,buyIPhone7"
p:advice-ref="myAfterAdvice"
/>
<!-- 配置用于真正调用的业务代理对象,其内部使用了原有业务对象的功能和增强的功能 -->
<bean id="customerProxy" class="org.springframework.aop.framework.ProxyFactoryBean"
p:proxyInterfaces="cn.dlian.business.ICustomer"
p:target-ref="customer"
p:interceptorNames="myBeforeAdvice,regexpAop" />
</beans>
public class MyAfterAdvice implements AfterReturningAdvice{
//本方法会在目标对象对应业务方法调用完毕后。自动调用本方法
public void afterReturning(Object arg0,Method arg1,Object[] arg2,Object arg3)
throws Throwable{
//参数1:原有业务方法的返回值(如果有的话)
//参数2:原有业务方法的抽象对象
//参数3:业务方法调用时,实际填入的参数形式的数组
//参数4:调动业务方法的业务对象,也许为null
if(arg3.getClass == CustomerImpl.class){
System.out.println("顾客买了苹果产品,赠送贴膜一张!");
}
}
}
public class MyBeforeAdvice implements MethodBeforeAdvice{
public void befor(Method arg0,Object[] arg1,Object arg2) throws Throwable{
System.out.println("进店有礼,赠送代金券一张!");
}
}
9.使用第三方包
aspectj-x.jar
aspectjweaver-x.jar
cglib-nodep-x.jar
@Aspect
public class Camers{
@Before("execution(* cn,dlian.business.Employee.*Eat*(..))")
public void foundEat(){
System.out.println("发现员工准备吃东西,警告一次");
}
@AfterReturning(value="execution(* cn,dlian.business.Employee.*Game(..))"
,returning="ret")
public void foundPlay(JoinPoint jp,Object ret){
Signature sig = jp.getSingnature();//增强器,拦截一次业务方法调用时形成的信息对象
//String className = sig.getDeclaringTypeName(); //业务类名
Object[] args = jp.getArgs();//获得调用业务方法时填入的实参
String methodName = sig.getName();//本次拦截的业务方法名
System.out.println("员工调用了"+methodName+",发现员工在玩游戏!");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 不再使用dtd的方式来限定xml文件中的标签,而使用新型xsd来限定! -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"
>
<!-- 员工对象 -->
<bean id="emp" class="cn.dlian.business.Employee" />
<!-- 摄像头对象 -->
<bean id="camera" class="cn.dlian.aop.Camera" />
<!-- 开启aop自动注解扫描,它会自动扫描所有类里面的AOP注解 -->
<aop:aspectj-autoproxy />
</beans>
10整合mybatis
spring-jdbc-x.jar
spring-tx-x.jar
commons-pool-x.jar:连接池
commons-dbcp-x.jar
commons-logging-x.jar
<?xml version="1.0" encoding="UTF-8"?>
<!-- 不再使用dtd的方式来限定xml文件中的标签,而使用新型xsd来限定! -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "
>
<!-- 1.配置数据源,其用于连接数据库 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
p:driverClassName="com.mysql.cj.jdbc.Driver"
p:url="jdbc:mysql://127.0.0.1:3306/dssims?serverTimezone=UTC"
p:username="root"
p:password="xuelei123"
p:initialSize="5"
p:maxActive="50"
p:maxIdle="20"
p:minIdle="5"
p:maxWait="10000"
p:validationQuery="select 1 from dual"
p:testOnBorrow="false"
p:testOnReturn="true"
p:testWhileIdle="true"
p:minEvictableIdleTimeMillis="60000"
p:timeBetweenEvictionRunsMillis="300000"
/>
<!-- 2.根据已经配置好的数据源,生成sessionFactory对象 -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:configLocation="classpath:MyBatis-config.xml"
p:dataSource-ref="dataSource"
p:mapperLocations="classpath:cn/dlian/entities/*.xml"
/>
<!-- 3.配置SqlSession,注入SqlSessionTemplate,
Dao层使用它来进行数据库操作(而不是SessionFatory来open了)-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sessionFactory" />
</bean>
<!-- 4.设置spring的事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
/>
<!-- 5.开启注解方式,进行自动事务处理的能力 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 6.配置业务中所需的各个bean,及其依赖关系 -->
<bean id="empDao" class="cn.dlian.dao.EmpDaoImpl"
p:sessionFactory-ref="sessionFactory"
/>
<bean id="empService" class="cn.dlian.service.EmpServiceImpl"
p:empDao-ref="empDao"
/>
</beans>
@Transactional 自动事务处理