1.Spirng需要的最基本的jar:commons-logging,spring-beans,spring-context,spring-core,spring-expression
2.一个典型的spring项目需要创建一个或者多个Bean配置文件,这些配置文件用于在spring IOC 容器里配置Bean,Bean的配置文件可以放在classpath下,也可以放在其它目录下。
3.通过helloworld例子我们可以知道:当我们创建spring的IOC容器对象【newClassPathXmlApplicationContext("applicationContext.xml")】时,对应的bean配置先调用构造器创建一个对象(反射【Bean中必须有无参的构造器】),然后再掉用setter来个属性赋值。然后我们先通过【context.getbean】获取对象然后强转,即可获得一个name已经有值的HelloWorld对象了。
4.控制反转(IOC):以前是组件先向容器发送请求查找资源,然后容器将资源返回给组件。
现在是容器主动的将资源推送给它管理的组件,组件所做的仅仅是选择一种合适的方式来接受资源。
5.依赖注入(DI):IOC的另一种表达方式,即组件以一些预先定义好的方式(例如setter)接受来自容器的资源注入
6.依赖注入可以使用属性注入和构造器注入(工厂方法注入不用),属性注入用<property name= value=>,构造器注入用<constructor-arg value= type=/index=>,当属性中有特殊字符(如<>)则使用<![CDATA[XXX]]>包含起来。可以使用property的ref属性来达到bean之间的引用。同时可以级联属性赋值(直接.)但是需要先要有对象(与struts2不同)
7.内部的赋值:List赋值(<List></List>),map赋值(<map><entry key="",value-ref=""></entry><map>),Property赋值(<props><prop key="">值</prop></props>)
8.外部的赋值(多处引用):使用util:<util:list id=""><ref bean=""><ref bean="">....</util:list>
9.属性赋值可以通过p的命名空间。p:name="" p:cars-ref="".....
10.可以使用autowire属性指定自动装配的方式,byName 根据bean的名字和当前bean的setter风格的属性名进行自动装配,若匹配的到则装配,匹配不到则为空。
11. bean配置之间可以继承(子可覆盖父)和依赖:使用parent="" 也可以写bean的模板(抽象bean) abstract="true",只用来被继承,不能被spring实例化。然后depend-on=""是指目前bean配置时必须制定一个关联bean
12.bean的作用域:默认是singleton(单例)【容器初始化时,bean的实例就创建好了,获取的都是同一个bean】,
可以使用scope来进行设置prototype(原型)【容器初始化时,bean没有实例化,而是在每次获取时创建一个新的bean】
13.给属性赋值可以使用SPEL来进行,引用类的静态属性:T(java.lang.Math).PI,引用其他类的bean:#{class},引用其他类的属性:#{class.properties},先判断ifelse再赋值(#{class.property > 300000 ? '金领':‘白领’})
14.ioc容器中bean 的生命周期:1.通过构造器或者工厂方法创建bean实例。2.为bean的属性设置值和对其他bean的引用。3.调用bean的初始化方法(init-method)。4.对bean进行操作。5.当容器关闭时,调用bean的销毁方法(destory-method)。
15.当需要对bean实例化前后进行处理(修改属性,或者修改整个bean,甚至重新创建一个bean返回),只需先实现BeanPostProcessor接口,然后对两个方法进行重写,注意这是对所以bean进行处理,所以对单个bean处理时应该用if(“”.equles(beanName))
16.面向切面编程之通知:
1.需要配置自动扫描的包(<context:component-scan base-package="com.yilang.aop"></context:component-scan>)
2.配置自动为匹配aspectJ注解的java类生产代理对象(<aop:aspectj-autoproxy></aop:aspectj-autoproxy>)
3.需要在通知类上面加俩注解@aspect和@component
4.需要在impl上面加上@Component("calculate")给bean定一个名字。
需要注意的是:分为五类:前置通知@before("execution(public int com.yilang.aop.Calculate.*(..))"),后置通知,返回通知,异常通知,环绕通知(需要这个参数ProceedingJoinPoint)。
17.可以使用@order(数字越小优先级越大)来改变切面的优先级
18.定义一个方法,用于声明切入点表达式 使用@PointCut 来声明切入点表达式,直接用方法名来引用就可以了
19.jdbctemplate的使用:
1.普通的jdbctemplate:常用rowmapper【BeanPropertyRowMapper<>(Person.class)】或者 list<Object[]>的参数集合。
2.具名的jdbctemplate(也叫NamedParameterJdbcTemplate),顾名思义就是把之前的?直接用:argname 明确指定【:name】,然后用update方法进行添加修改等操作,你可以直接传一个参数map(较为复杂),也可以直接传一个对象(:参数名必须与实体类字段一致)然后使用sqlParameterSource的beanPropertySqlParameterSource 实现类作为参数,直接存对象。
20.使用spring声明式事务需要:
1.配置两个:
【<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>】
【<!--启用事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>】,然后在你需要添加事务的方法上加上@Transactional注解即可。
21.spring事务的传播性:当一个拥有事务的方法调用另一个有事务的方法时就要设置事务的传播性选择。常用的有俩(REQUIRES,REQUIRES_NEW)。REQUIRES 就是被调用的方法直接使用调用者的事务。REQUIRES_NEW,则是被调用的方法直接再开启一个新事务来运行,此时调用者事务挂起等待被调用方法的事务完成再执行。
(propagation = Propagation.REQUIRES_NEW)
22.spring的事务隔离级别:最常用的是 isolation = Isolation.READ_COMMITTED(读已提交);设置异常回滚:spring声明式事务默认是对所有运行时的异常都进行回滚,也可以通过rollbackFor 或者 norollbackFor进行具体的设置;设置只读属性:设置readOnly来设置是否为只读(只是读取,不写入的时候用,可以优化数据库引擎);使用timeout属性 可以指定强制回滚之前事务可以占用的时间。(超时不管是否有异常,都强制回滚)
23.spring基于xml的事务:
1.配置相关的bean(需要给依赖注入的属性加上setter)
2.配置事务管理器
【<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>】
3.配置事务属性
【<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>】
4.配置事务切点,以及把事务切入点和事务属性关联
【 <aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.yilang.txxml.BookShopService.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"></aop:advisor>
</aop:config>】