薛磊 Job Seeker

Spring

2019-06-11

五、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 自动事务处理

回到顶部


上一篇 MyBatis

下一篇 软件工程

Comments

Content