springaop

1.什么是spring

它是一个轻量级和IOC(DI)和AOP的 容器框架

IOC:控制反转 现在创建bean的方式,是交给spring帮我们创建。

DI:依赖注入 spring它是容器框架,是一个bean(装对象的)容器框架,spring帮我创建好对象之后,在把我们创建好的对象 注入到相应的类里面 这个过程
AOP: 面AOP使用场景:

​ 事务管理

​ 日志管理

​ 性能控制向切面的编程

1.2 spring的DI依赖注入

1.2.1 set方式注入

以前

UserController{

​ private UserService userService;

​ void setUserService(UserService userService){

​ this.userServicer = userService;

​ }

}

1.2.2构造器注入

使用构造参数(类里必须要有构造方法且和其参数对应),按顺序赋值可以用name,索引和类型
name 参数名字注入

 <constructor-arg name="id" value="456"></constructor-arg>

index索引注入

 <constructor-arg index="0" value="123"></constructor-arg>

type类型注入

  <constructor-arg type="java.lang.Long" value="111"></constructor-arg>

如有参数是对象用ref引用已经创建好的bean

 <constructor-arg ref="otherBean"/>
    或者在内部创建
<constructor-arg>
<bean class="cn.itsource._01_.OtherBean"/>
</constructor-arg>

1.2.3 类里面属性注入

属性注入: 最常用就是基本类型和引用类型注入
通过属性来注入 底层调用set方法

<property name="id" value="2"></property>
<property name="name" value="zzy2"></property>

数组注入

 <property name="arrays" value="1,2,a,v"></property>
    <property name="arrays">
        <array>
            <value>1</value>
            <value>a</value>
            <value>张志远</value>
        </array>

List/Set

 <property name="list">
        <list>
            <value>1</value>
            <value>a</value>
            <value>张志远</value>
            <value>1</value>
        </list>
    </property>

List Set
这里的ref引用的是同一个对象不会创建新的,
而bean是配置几个就创建几个对象是不同的。

    <property name="helloBeanList">
        <list>
            <ref bean="helloBean"></ref>
            <ref bean="helloBean"></ref>
            <bean class="_01_di.HelloBean"></bean>
            <bean class="_01_di.HelloBean"></bean>
        </list>
    </property>

1.3 XML版本自动注入

可以byName – 按照名称自动注入

或者byType注入 – 按照类型自动注入
default-autowire=“byName”
这是选择注入的方式有byName和byType默认是byType
如果一个有两个bean 都指相同一个类型的时候,就会报错 不能通过类型注入
可以通过名称注入

1.4 XML版本注解注入–掌握

扫描包路径
<context:component-scan base-package="_03_annoxml"></context:component-scan>

如果一个接口有两个实现情况下:

   方案一:一个接口有多个实现的情况下面 通过名字去区分
   @Autowired
   @Qualifier("save")
   方案二:通过Resource这个注解
   @Resource(name="save")
   区别:@Autowired和@Qualifier 都是属于spring的注解 ,
      Resource使用jdk的注解 推荐使用Autowired和Qualifier,可以和spring进行无缝衔接
      autowired默认是根据类型匹配,如果类型匹配不上在根据名字匹配
      而Resource默认根据名字匹配,名字匹配不上就匹配类型

2 Spring里面AOP功能

2.1 什么是springAOP

aop: 面向切面的编程

2.2aop的实现

aop底层使用代理模式实现

jdk代理模式 --有接口情况下

cglib动态代理 --没有接口情况下

2.3 springaop配置方式

xml版本的配置

<context:component-scan base-package="_04_aopxml"></context:component-scan>
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* _04_aopxml.I*Service.*(..))"></aop:pointcut>
        <!--配置通知-->
        <aop:aspect ref="txManager">
            <!-- 前置通知-->
            <!--<aop:before method="begin" pointcut-ref="pointcut"></aop:before>
            &lt;!&ndash; 后置通知&ndash;&gt;
            <aop:after-returning method="commit" pointcut-ref="pointcut"></aop:after-returning>
            &lt;!&ndash; 最终通知&ndash;&gt;
            <aop:after method="close" pointcut-ref="pointcut"></aop:after>
            &lt;!&ndash; 异常通知&ndash;&gt;
            <aop:after-throwing method="rollback" throwing="e" pointcut-ref="pointcut"></aop:after-throwing>-->
            <!-- 环绕通知-->
            <aop:around method="around" pointcut-ref="pointcut"></aop:around>
        </aop:aspect>
    </aop:config>
    <bean id="txManager" class="_04_aopxml.TxManager"></bean>

注解版本配置

@Component
@Aspect
public class TxManager {


    @Pointcut("execution(* _05_aopanno.I*Service.*(..))")
    public void pointcut(){}

    //<aop:before method="begin" pointcut-ref="pointcut"></aop:before>
    //@Before("pointcut()")
    public void begin(){
        System.out.println("开启事务");
    }

  ///  @After("pointcut()")
    public void commit(){
        System.out.println("提交事务");
    }
    //@AfterReturning("pointcut()")
    public void close(){
        System.out.println("关闭");
    }
    //所有的异常的父类
   // @AfterThrowing(value = "pointcut()",throwing = "e")
    public void rollback(Throwable e){
        System.out.println("回滚事务"+e.getMessage());
    }

    //环绕通知
    @Around("pointcut()")
    public void around(ProceedingJoinPoint joinPoint){
        try {
            begin();
            //调用方法
            joinPoint.proceed();
            commit();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }finally{
            close();
        }
    }
}

3 Bean的创建方式

以前模式:通过new 对象方式创建

spring方式 :spring帮我们创建bean 。–创建bean的方式

3.1 Bean创建方式一

通过无参数的构造方法来创建bean --最常用方式

配置

<bean id="mybean" class="_06_bean.Mybean"></bean>

3.2 Bean创建方式二

FactoryBean

public class MybeanFactoryBean implements FactoryBean<Mybean> {
    //返回对象
    public Mybean getObject() throws Exception {
        return new Mybean("xxx", "18");
    }

    public Class<?> getObjectType() {
        return Mybean.class;
    }
    //是否单例
    public boolean isSingleton() {
        return true;
    }
}

3.3 Bean创建方式三

通过类里面定义静态方法 来获取bean

public class MybeanFactory {

    public static Mybean getBean(){
        return new Mybean();
    }
}
<bean class="_06_bean.MybeanFactory" factory-method="getBean"></bean>

3.4 Bean创建方式四

public class MybeanFactory1 {
    //普通方式
    public  Mybean getBean1(){
        return new Mybean();
    }
}
<bean class="_06_bean.MybeanFactory1" id="mybeanFactory1"></bean>
    <bean factory-bean="mybeanFactory1" factory-method="getBean1"></bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值