Spring学习笔记

                                                        Spring

1、  SPEL:使用#{}为界定,内涵表达式,注入字面值一般用处不大,重要是在其中引用已经配好的bean的属性,以及实现各种表达式:eg:

a)        <constructor-arg  name="money" value="#{T(java.lang.Math).PI*1000}"/>

b)        <constructor-arg  name="cno"  value="#{10000001}"/>

c)        <constructor-arg  name="cno"  value="#{true==true?”true”:”false”}"/>

d)            <bean id="card_1"   class="com.liuyanzuo.Card">

                   <constructor-arg  name="cno"  value="10000001"/>

                   <constructor-arg  name="money" value="#{T(java.lang.Math).PI*1000}"/>

         </bean>

         <bean  id="stu_1"class="com.liuyanzuo.Student">

                   <constructor-arg  value="#{card_1.getCno()}"/>

                   <constructor-arg  value="liuyanzuo"/>

                                      <constructor-arg  ref="card_1"></constructor-arg>

                            </bean>

2、  bean的生命周期:

a)        通过直接或工厂方法创建Bean实例

b)        为Bean的属性设置值和其他Bean的引用

c)        调用Bean的初始化方法init方法

d)        Bean使用

e)        当容器关闭时,调用Bean的销毁方法destroy方法

f)         具体配置:

                        i.             <bean id=””  class=”” init-method=”init_name”destroy-method=”destroy_nam”>

g)        Beand的后置处理器:允许在调用初始方法前后对Bean进行额为处理,对象为全部Bean,需实现BeanPostProcessor接口,IOC容器自动识别(需要配置受到Spring管制)

1.  package com.lifecycle;

2.   

3.  import org.springframework.beans.BeansException;

4.  import org.springframework.beans.factory.config.BeanPostProcessor;

5.   

6.  public classBeanA implementsBeanPostProcessor{

7.   

8.      @Override

9.      publicObject postProcessAfterInitialization(Object arg0, String arg1)

10.             throws BeansException {

11.         System.out.println("I am after init...");

12.         return arg0;

13.     }

14.  

15.     @Override

16.     publicObject postProcessBeforeInitialization(Object arg0, String arg1)

17.             throws BeansException {

18.         System.out.println("I am before init...");

19.         return arg0;

20.     }

21. }           

3、  Bean的配置:

a)        全对象名配置,如前面

b)        工厂方法配置

                        i.             静态工厂方法:通过工厂静态方法返回,配置如下,不用配置目标Bean:

<bean id="card_2" class="com.liuyanzuo.bean.StaticCardFactory" 

                   factory-method="getCard">

                                     <!—如果getCard中需要参数,用constructor-arg来注入-->

                            </bean>

                   如果不配置scope,则得到的为同一个Bean实例

                      ii.             实例工厂方法:创建工厂本身,再调用工厂方法

<bean id="cardfactory" class="com.liuyanzuo.bean.InstanceCardFactory" />

                   <beanid="card_3"  factory-bean="cardfactory"  factory-method="getCard">

                            <constructor-arg value="1000002"></constructor-arg>   

</bean>

在程序开始时,InstanceCardFactory就new了出来,并且执行了getCard的方法,所以得到的bean为相同bean

4、  使用注解配置Bean

a)        注解的类型:

                        i.             @Componnent:基本注解,标识一个受Spring管理的类

                      ii.             @Respository:标识持久层

                     iii.             @Service:标识服务层

                     iv.             @Controller:标识表现层

                      v.             @Qualifier:表明辨识串,相当于ID

b)        在Spring配置文件中加上<context:component-scan base-package=””  resource=pattern=”/*.class”

use-default-filter=”false”         

c)        <context:include-filter type=”annotation” expression=”package_name”>

d)        <context:exclude-filter>

e)        use-default-filter=”false” true

f)         bean之间的关联关系

                        i.             AutowireAnnotationBeanPosprocessor后置处理器会自动添加具有

1.        @Autowired:自动加载,可以在字段上加,也可以在set方法上加,如果在Spring容器中没有,则可以设置required=false,但可能为空值;当有多个相同接口的实现类时,而在类中拥有一个接口应用时,则通过(注解中)名字去寻找,或者加上@Qualifier指定名

5、  AOP注解配置:

a)        通过AspectJ的注解方式来进行注解

                        i.             创建一个切面Bean,将此Bean放入IOC容器中,@Aspect @Compent,然后配置切点@Before/@After/@Exception等(execution(package_name.method_name))

                      ii.             在XML中声明注解有用

<aop:aspect-autoproxy/>     

                     iii.             在代理方法中,可以有一个参数,传入JoinnPoint,从而获得Method

                     iv.             当一个类实现了接口时,使用AspectJ动态代理时,得不到此类的实例,因为返回的是动态代理类,共同继承一个接口,所以应该用接口来接受动态代理类

b)        前置方法:@Before(“execution(* package_name.class_name.method_name(params) )”)

c)        后置方法:@After(..),在后置方法中,无法访问到方法执行的结果

d)        返回方法:@AfterReturning,方法正常执行返回的时候所执行的方法

e)        异常通知:@AfterThrowing(value=”execution ()” throw=”name” ),方法出现异常的时候,可以访问到异常对象

f)         环绕通知:@Around:需要携带ProessdingJoinPoint对象,执行方法,

6、  切面优先级,使用@Order(number)

7、  重用PointCut@Pointcut

8、  Spring支持JDBC

a)        配置数据源

                        i.             <bean id=”” class=”datasource_name”>

                      ii.             <property name=”user” value=”xxx”>来配置相关信息

b)        配置JDBCTemplete

                        i.             <bean id=”” class=”org.springframework.xxxx.JdbcTemplete”>

1.        <property name=”dataSource”ref=”xx”>

c)        从数据库中拿出对象:

                        i.             queryForObject(sql,rowMapper,?);

                      ii.             使用sql的别名完成列名和属性名的映射,        

                     iii.             无法使用级联

d)        从数据库中拿出对象集合:

                        i.             用quer(sql,rowMapper,?)

9、  事务:原子性操作

a)        带有切入点, 通知和增强器的 Bean 配置文件:

                        i.             配置数据源

                      ii.             配置事务管理器

                     iii.             配置管理器通知:<tx:advice id=”” transaction-manager=”” >

                     iv.             配置AOP,加入增强器:<aop:advisor advice-ref=”” pointcut-ref=”” >

b)        用 @Transactional 注解声明式地管理事务:

                        i.             可以将@Transactional注解放在方法或者类前

                      ii.             在配置文件中<tx:annotation-driven>启用

c)        事务传播属性:当一个事务方法被另一个事务方法调用时,必须指定事务应该如何传播,

                        i.             REQURED:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事物,并在自己的事务内运行

                      ii.             REQURED_NEW:当前方法必须启动新事物,并在自己的事务内运行,如果有事务正在运行,应该将它挂起

                     iii.             SUPPORTS

                     iv.             NOT_SUPPORTED

                      v.             MANDATORY

                     vi.             NEVER

                   vii.             NESTED

                  viii.             使用propagation指定事务的传播方法

d)        事务的隔离级别,使用isolation属性来指定事务的隔离级别,默认情况下对所有运行时异常进行回滚,可以通过Transaction属性指定(noRollbackFor,RollbackFor,readOnly)

10、             Spring整合Hibernate:

a)        Spring产生SessionFactory

                        i.             可以利用Spring来产生SessionFactory工厂,以及整合Hibernate事务:

1.        配置好共用数据源:

<bean id="datasource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource>

            <property name="username"  value="liuyanzuo"/>

            <property name="password"  value="Apprentice"/>

            <property name="url"value="jdbc:mysql://localhost:3306/spring"/>

<property name="driverClassName"  value="com.mysql.jdbc.Driver"/>

            </bean>

2.        配置好SessionFactory Bean

<bean id="sessionFactory"  class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

          <property name="dataSource" ref="datasource"/>

<property name="configLocation"  value="classpath:hibernate.cfg.xml"/>

        <property name="packagesToScan">

            <list>

                <value>com.liuyanzuo.model</value>

            </list>

        </property>

</bean>

如果使用注解,则使用packageToScan,如果使用XML文件,则使用mappingResources

 

3.        配置好HibernateTransactionManager Bean

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

            <property name="dataSource"ref="datasource"/>

            <property name="sessionFactory"ref="sessionFactory"/>

</bean>

4.        配置一个<tx:advice>

<tx:advice id="advice_1" transaction-manager="transactionManager">

 <tx:attributes >

            <tx:method name="*" isolation="DEFAULT"/>

            </tx:attributes>

            </tx:advice>

5.        配置AOP

<aop:config>

<aop:pointcut expression="(execution(*com.liuyanzuo.model.Dao.save(..)))" id="point_1"/>

            <aop:advisor advice-ref="advice_1" pointcut-ref="point_1"/>

</aop:config>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值