SSH--------------------------Spring

Spring框架

SpringIOC:控制反转【使用Spring容器创建对象】

《对象的创建》

1.写一个java类;

2.将该类放入Spring容器;

  <bean id="helloWorld" class="cn.itheima03.spring.ioc.createobject.HelloWorld"></bean>

利用JAVA反射创建对象。

3.启动Spring容器;

4.取出对象;

《三种方法实例化bean》

1.默认构造函数

2.静态工厂方法实例化

3.实例工厂方法实例化

《Sprig创建对象默认的是单例对象》

1.Springle创建的对象默认的是单例的

2.把scope改为 prototype ,就是多例模式

3.Spring在默认情况下:启动Spring容器的时候创建bean对象

4.当把lazy-init设置为true以后,就是在调用对象的时候才会去创建对象

《Spring容器对对象的初始化,销毁的控制》

1.如果是单例对象,Spring容器对对象的创建,初始化和销毁都是Spring容器控制的;其中创建对象完成以后,执行init方法。当Spring容器关闭的时候,执行destroy方法。

2.如果不是单例对象,是多例对象的话,Spring容器不负责对象的销毁,只会负责对象的创建和初始化。

3.如果spring中的bean是多例的,不管在配置文件中lazy-init设置成什么样的值,在context.getBean时才要创建对象【调用的时候才会创建对象】,而且不负责销毁。

SpringDI:依赖注入【使用Spring容器为对象的属性赋值】

1,使用set方法为属性赋值:

在配置文件中使用<property></property>为对应的属性赋值,在Spring容器启动的时候,先创建对象然后封装对象,为对象的属性赋值

2.使用构造器为属性赋值:

在配置文件中

<bean id="person_con" class="cn.itheima03.spring.di.constructor.Person">

           <constructor-arg index="0" value="王二麻子"></constructor-arg>

           <constructor-arg index="1" ref="student_con"></constructor-arg>

      </bean>

当Spring容器启动的时候,创建对象用上面的constructor确定构造函数,然后利用该构造器就可以了【封装属性的值】,不用默认的构造函数了。

 

Spring的注解

在Person.java的student属性上 @Resource(name="student")来注解

1、在spring的配置文件中,加入命名空间

        xmlns:context="http://www.springframework.org/schema/context"

        http://www.springframework.org/schema/context

           http://www.springframework.org/schema/context/spring-context-2.5.xsd

2、在spring的配置文件中,开启注解解析器

       <context:annotation-config></context:annotation-config>

3、把person和student放入到spring容器中

       <bean id="person" class="cn.itheima03.spring.di.annotation.Person"></bean>

       <bean id="student" class="cn.itheima03.spring.di.annotation.Student"></bean>

4、在Person类中的student不需要set和get方法

 

原理:

     1、当启动spring容器的时候,给spring容器的bean创建对象

     2、当spring容器解析到<context:annotation-config></context:annotation-config>的时候,

         spring容器扫描在spring容器中的bean

     3、查看bean中的属性或者方法上有没有@Resource

           1、有

               1、如果该注解的属性name的值为"",则会按照属性的名称和spring中的ID值进行匹配,如果匹配

                  成功,则赋值,如果匹配不成功,则按照类型进行匹配,如果类型匹配不成功,则报错

               2、如果该注解的属性name的值不为"",则按照name属性的值和spring中的ID值进行匹配,

                   如果匹配成功,则赋值,匹配不成功,则报错

           2、没有

 

 

说明:

   基本类型不能用注解赋值 

   注解的效率没有xml文件的高,但是书写比较简单

   Autowired按照类型进行匹配

   @Autowired

   @Qualifier("studen")按照ID进行匹配

   按照类型匹配比较危险

 

《SpringAop面向切面编程》【切面:事务;通知:开启事物,关闭事务等就叫通知。SpringAop实现控制事务的原理是使用 代理对象;】

1.使用SpringAop来实现事务的控制

《SpringAop的配置》

1.在Spirng的配置文件中配置SpringAop的三要素:1.目标类。2. 切面。3.进行AOP的配置

2.重点掌握AOP的配置

实例:

 <aop:config>
         <!--
         aop:pointcut:切入点表达式
                         expression切入点表达式--对应目标类
                         id  唯一标示    
                         expression切入点表达式--规定对应的目标类
         execution(* cn.itheima03.spring.aop.xml.ClassesDaoImpl.*(..)):代表cn.itheima03.spring.aop.xml.ClassesDaoImpl类中的所有方法        
          -->
         <aop:pointcut expression="execution(* cn.itheima03.spring.aop.xml.ClassesDaoImpl.*(..))" id="perform"/>
         <!--
             aspect:切面
             ref引向切面的bean
          -->
         <aop:aspect ref="myTransaction">
         
             <aop:before method="beginTransaction" pointcut-ref="perform"/>
         
             <!--
                 后置通知
                     returning 返回值
              -->
              <!--
             <aop:after-returning method="commit" pointcut-ref="perform" returning="val"/>
              -->
             <!--
                 最终通知
                        无论目标方法是否有异常,都执行
              -->
              <!--
             <aop:after method="finnalyMethod" pointcut-ref="perform"/>
              -->
             <!--
                 异常通知
                     throwing 获取目标方法抛出的异常信息
              -->
             <aop:after-throwing method="throwingMethod" pointcut-ref="perform" throwing="ex"/>
             <!--
             <aop:around method="aroundMethod" pointcut-ref="perform"/>
              -->
         </aop:aspect>
     </aop:config>

《SpringAOP的实现原理》

1.Spring容器开始的时候创建目标类对象和切面类对象,阅读到<aop:config>AOP配置的时候,通过切入点表达式去寻找Spring容器中创建的bean对象。如果找到该对象,就把目标类和通知结合起来创建出代理对象。如果没有找到该对象,就会报错。通过代理对象来实现对数据库的操作。例如对于数据库操作来说:我们只用关心数据库的增删该查操作就可以了,不用去关心事务了,由Spring容器去控制事务.

2.如果目标类实现了接口,生成的代理对象是jdkproxy,同时context.getBean()得到的是对象使用接口完成转化;如果没有实现接口,生成的代理对象是cglibproxy代理类,得到的是实例对象。

《SpringAOP的各种通知》

1.前置通知:在目标方法之前执行;无论目标方法遇到异常都执行

2.后置通知:在目标方法之后执行;如果目标方法遇到异常,则不执行;可以获取到连接点的一些信息

3.最终通知:相当于finally,无论目标方法是否遇到异常都执行

4.异常通知:获取目标方法抛出的异常信息;throwing参数的配置才能获取信息

5.环绕通知:相当于jdkproxy的invoke方法,控制目标方法的执行

 

《SpringAop的配置》

1.在配置文件中明确目标类和切面类。

2.明确切入点和通知

其中【切入点】指的是切面的具体实现应用在目标类的那些方法和属性上面,在执行目标类的那些方法的时候触发切面的应用

【通知】就是在目标类的方法执行的摸个阶段开始出发这些通知

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/2870118/blog/747736

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值