spring学习文档

2019-08-28  本文已影响0人  磨陀货_

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.png
1.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
有报错信息
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 -- 单个

上一篇下一篇

猜你喜欢

热点阅读