Spring

Spring
IoC

    正转:由程序员自己来创建对象

    inversion of control
    控制反转:由spring容器来创建对象

    对于Spring而言,所有的对象都可以被看成是bean对象,所以在Spring的xml文件中使用bean节点来创建对象
    对于bean节点而言,默认每个bean对象都是单例的,但是i可以通过scope来设置他的模式
        scope包含有以下几个值:
            singleton:默认值,单例模式
            prototype:多例
            request:web程序中,同一个请求将是同一个实例对象
            session:web程序中,同一个会话将是同一个实例对象
            global-session:web程序中,同一个全局会话(application)将是同一个实例对象



​ spring配置文件中bean和property的搭配,要求该bean对应的class必须要有无参构造器
​ 对于property来设置对象属性,要求该对象的该属性必须要有标准的setter方法,这个技术点有点类似于jsp的标准动作useBean和setProperty

​ <jsp:useBean id=‘stu’ class=‘com.qfedu.pojo.Student’ />
​ Student stu = new Student();

<jsp:setProperty name = ‘stu’ property = ‘name’ value = ‘zhangsan’ />
stu.setName(“zhangsan”);

    spring的配置文件中bean和constructor-arg的搭配:
        1.  name + value的方式,可读性最高
        <constructor-args name="name" value="zhangsan" />

        2.  value,代码最简单,可读性最差,要求value的顺序与构造器的顺序一致,否则报错
        <constructor-args value="zhangsan" />

        3.  index + value, 顺序可以随便写,最终的赋值是按照索引来赋值。索引从0开始
        <constructor-args index='0' value='zhangsan'>

        4. type + value,不同类型的属性赋值顺序随意,相同类型的属性按照顺序赋值
        <construcor-args type='java.lang.String' value='zhangsan' />

Spring AOP的7种实现方式

   1.  Proxy.newProxyInstance()
        包含三个参数:
            1.  类的加载器
            2.  接口的类对象们
            3.  InvocationHandler回调接口
                其中该回调接口包含了一个回调方法:
                    Object invoke(Object proxy, Method method, Object[] args)
                    包含了三个参数:
                    1。  proxy代理对象
                    2。  method代理方法
                    3。  每个代理方法中的参数列表
    2. Enhancer
       四个步骤
     *  1.  创建Enhancer对象
     *  2.  设置增强类对象的superClass
     *  3.  设置增强类对象的回调
            MethodInterceptor回调接口,该接口中包含来一个回调方法
                Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
                该方法包含了四个参数:
                    1。  代理对象
                    2。  方法对象
                    3。  方法的参数列表
                    4。  方法的代理对象
     *  4.  通过Enhancer对象的create()方法来创建对象并返回
    3. 使用Spring写好的ProxyFactoryBean来设置aop
        包含有四个子节点
            target:代理对象
            interfaces:代理对象的接口列表对象
            optimize:是否强制使用cglib动态代理
            intercepterNames:拦截对象,要求该类实现MethodIntercepter接口
	4.ProxyFactoryBean
	 使用ProxyFactoryBean对象就可以实现代理,包含四个属性:
            1.  target:目标对象,在哪个对象上使用代理
            2.  interfaces接口们
                <list>
                    <value>com.qfedu.service.IUserService</value>
                    <value>com.qfedu.service.IUserService</value>
                    <value>com.qfedu.service.IUserService</value>
                    <value>com.qfedu.service.IUserService</value>
                </list>
            3.  interceptorNames拦截器名,就是上面定义好的实现了MethodInterceptor接口的MyAspect切面类对象
            4.  optimize:是否强制使用cglib的动态代理方式实现aop
                    true:cglib方式
                    false:jdk自带的代理方式
                    cglib:code generation library:是一个相对功能强大时的代码生成库, 效率相对于jdk自带的代理方式要高
     5.  五种通知方式的xml实现
        1.  前置通知 aop:before
        2.  后置通知 aop:after
        3.  环绕通知 aop: around
        4.  有返回值的通知 aop:after-returning
        5.  带有异常抛出的通知 aop:after-throwing

            <aop:config proxy-target-class="true">
                <aop:aspect ref="ma">
                    <aop:pointcut id="pc" expression="execution(* com.qfedu.aop05.*.*(..))" />

                    <aop:before method="myBefore" pointcut-ref="pc" />
                    <aop:after method="myAfter" pointcut-ref="pc" />
                    <aop:around method="myAround" pointcut-ref="pc" />
                    <aop:after-returning method="myReturn" pointcut-ref="pc" returning="obj" />
                    <aop:after-throwing method="myThrow" pointcut-ref="pc" throwing="e" />
                </aop:aspect>
            </aop:config>

    6.  五种通知的注解实现方式:
            <!--
                context:component-scan:上下文的组件扫描
                    basepackage:指定要扫描的整个包
            -->
            <context:component-scan base-package="com.qfedu.aop06" />

            <!--
                aop:aspectj-autoproxy: 切面的自动代理
            -->
            <aop:aspectj-autoproxy />

            在业务实现类之上添加Component注解并且给该组件一个名字us
            
            在切面类之上添加两个注解,Component和Aspect
                在切面类的每个方法之上分别添加@Before@After@Around@AfterReturning@AfterThrowing
                其中AfterThrowing和AfterReturn里面要额外加参数obj和throwable对象

    7.  新增一个类MyBeanPostProcessor实现BeanPostProcessor接口
            该接口可以处理所有的bean对象的请求方法
            里面有两个方法需要进行实现
            postProcessBeforeInitialization
                return bean对象
            postProcessAfterInitialization
                使用proxy的newProxyInstance()方法来对于所有的业务对象类中的方法来进行处理

        在aop07.xml中新增一个节点将MyBeanPostProcessor来在xml中创建

            <bean id="ius" class="com.qfedu.aop07.UserServiceImpl" />

            <bean class="com.qfedu.aop07.MyBeanPostProcessor" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值