IOC(控制反转),也称DI(Denpendency Inject依赖注入)。 1.把自己new的东西改为由容器提供。 初始化具体bean 动态装配 2.好处:灵活配置。 控制反转:将控制权交给容器 依赖注入:setdao根据实际的dao注入(setdao依赖于实际的dao) spring是一个IOC容器,可以实例化具体的bean,还可以动态装配。 还支持AOP:安全检查,管理transaction。 FAQ:不给提示 a.window-preferences-myeclipse-xml catalog b.User Specified Entries - add location: ....../spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd Key Type: Schema Location Key: http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 注入类型: 1.setter(重要) 2.构造方法 3.接口注入 Id&Name: name和id都可以,但是name中可以含有特殊字符。 简单属性注入:<property name=... value=...> Bean的scope(生存范围): 默认是sigleton:单例,每次取到的bean都是同一个。 还有prototype:取到的不是同一个,每次都创建新的对象。 还有和web相关的三种方法,较少用。 集合注入。 自动装配: byName byType 一般写在bean标签上,如果所有的bean都用同一种,可以使用beans的属性:dafaule-autowire 生命周期: lazy-init (一开始不初始化,用到的时候才初始化) init-method="init" destory-method="destory" 不要和prototype一起使用 类被初始化的时候调用init,被消亡的时候调用destory @Autowired 默认按类型by Type 如果想用byName,使用@Qulifier 写在priavate field(第三种注入形式)--不建议,破坏封装 如果写在set上,@quailfier需要写在参数上 @Resourde(重要) 加入:j2ee/common-annotations.jar 默认按名字,名字找不到,才按类型 可以指定特定名称 推荐使用 不足:如果没有源码,就无法使用annotaton,只能使用xml @Component 初始化的名字默认为类名首字母小写 可以指定初始化bean的名字 @Scope @PostConstruct = init-method @PreDestroy = destroy-method 面向切面编程: Aspect-Oriented-Programming 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码 例如: servlet:filter struct:Intercepter 还可以应用于:权限检查,异常处理,效率计算,事务管理。 概念(第22集后面): JoinPoint PointCut Aspect Advice Weave Spring AOP配置与应用: 两种方式:使用Annotation和使用xml Annotation: 加上对应的xsd文件spring-aop.xsd beans.xml<aop:aspect:j-autoproxy /> 此时就可以解析对应的Annotation 建立我们的拦截类 用@Aspect注解这个类 建立处理方法 用@before来注解这个方法 写明白切入点 让spring对我们的拦截器进行管理@Component 常见的Accotation: @Pointcut @Before @AfterReturning @AfterThrowing @After @Around Spring整合Hibernate: Spring指定datasource 1.参考文档,zhao dbcp.BasicDataSource c3p0 dbcp proxxo 在DAO或者Service中注入dataSource 在Spring中可以hi用PropertyHolderConfigure来读取Properties文件的内容。 Spring 整合Hibernate: 1.<bean..AnnotationSessionFactoryBean> <property dataSource> <annotationClasses> 2.引入Hibernate系列jar包 User上加Annotation UserDAO或者UserService注入SessionFactory jar包问题一个一个解决。 声明式的事务管理: 事务加载DAO层还是Service层? annotation: 加入annotation.xsd 加入txManager bean <tx:annotation-driven 在需要的事务的方法上加@Transational 需要注意,使用SessionFactory.getCurrentSession不要使用openSession @Transactional详解: 什么时候rollback: 1.运行期异常,非运行期异常不会触发rolback 2.必须uncheck(没有catch) 3.不管什么异常,只要你catch了,spring就会放弃管理 4.事物传播特性:propagation_required 5.read_only xml(推荐,可以同时配置很多方法) 1.<bean txManager 2.<aop:config <aop:pointcut <aop:advisor pointcut-ref advice-ref 3.<tx:advise:id transaction-manager= HibernateTemplate、HibernateCallback、HibernateDaoSupport(不重要) 介绍: 设计模式:Template Method Callback----回调、钩子(函数) 1.第一种: <1.在Spring中初始化HibernateTemplate,注入sessionFactory <2.DAO里注入HibernateTemplate <3.save写getHibernateTemplate.save(0 2.第二种: <1.从HibernateDaoSupport继承 <2.必须卸载xml文件中,无法使用Annotation,因为set方法在父类中,而且是final的 spring整个hibernate的时候使用packageToScan属性,可以让spring自动扫面对应包下面的实体类。 整合步骤: 需要的额jar包在48集。 将这些所有的jar包保存到一个位置,使用的时候直接copy。 首先加入jar包 整合Spring+Hibernate: 1.建立package <1.dao/daoimpl/model/service/serviceimpl/test 2.建立对应的接口与类框架 S2SH_01 3.建立Spring的配置文件(建议自己保留一份经常使用的配置文件,以后用到的时候直接copy改) 4.建立数据库 5.加入Hibernate注解 <1.在实体类上加相应的注解@Entity@Id等 <2.在beans配置文件配置对应的实体类,使之受管 6.写dao service的实现 7.加入Spring注解 <1.在对应Service及DAO实现中加入@Component,让spring对其初始化 <2.在service上加入@Transactional或者使用xml方式(此处建议后者,因为更简单) <3.在DAO中注入sessionFactory <4.在servcie中注入DAO <5.写dao与service的实现 8.写测试 整合Strust2 结合点:Struts2的Action由Spring产生 步骤: 1.修改web.xml加入struts的filter 2.再加入spring的listener,这样的话,webapp一旦启动,spring容器就初始化 3.规划struts的action和jsp展现 4.加入struts.xml 修改配置,有spring替代struts产生Action对象 5.修改action配置 把类名改为bean对象的名称,这个时候就可以使用首字母小写了 @Scope("prototype")不要忘记 struts的读常量顺序: struts-default.xml----struts-plugin.xml----struts.xml----struts.properties----web.xml 中文问题: 1.struts2.1.8已经修正,只需要改i18n.encoding=gbk 2.只用spring的characterencoding 3.需要严格注意filter的顺序 4.需要加到struts2的filter前面 LazyInitializationException: 1.OpenSessionInViewFilter 2.需要严格顺序问题 3.需要加到struts2的filter前面