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>