1、为什么要使用 Spring?充斥了大量的单利和工厂,而且配置不够集中,没有统一的管理,迫切需要一种框架提供生命事物,重量级的东西侵入性高Spring?最核心的东西 IOC,控制翻转,对象之间有关系 ,依赖关系,对象可以自动穿件依赖AOP 面向切面 可以对普通 java 对象提供声明式服务。横切性技术 HIBERNATE 的拦截器 也是横切技术,EJB 和 Spring?通常有个对比 EJB是重量级的 如果想提供服务 必须是 EBJ 主键 只要是普通 java 对象 AOP 逗可以提供服务,还可以和许多框架集成,Session 的管理,事物的管理,对象的创建和管理 ,逗可以做,我们只要专注于业务
2、就可以了+IOC inversion of control (控制翻转):由容器来管理对象之间的依赖关系(不是对象本身来管理)就叫控制翻转而传值过程就叫 dependency injection (依赖注入) 就是一个大的工厂( 你发起的主动关系别人一变化你就你影响。他追你就不一样了,只提供 set 方法就射入进去了,没有侵入性主要体现在这里,只要提供 set 方法和构造函数就可以,离开spring 也可以)AOP1:Spring 的依赖库2:Copy spring 配置文件到 SRC 下4:配置依赖关系(提供构造函数和 set 方法)5:让 spring 管理我们的对象创建和依赖,必须在 S
3、pring 文件中进行配置和定义6:编写客户端Application.xml标签 id 唯一性的标识配置依赖关系Ref 是一个引用 把 ref 的东西传进来注入没有依赖关系 提供时是标准的构造方法SETTE 方法ApplicationContext ctx = new ClassPathXmlApplicationContext(“applicationContext.xml“);UserEbi userEbi = (UserEbi)ctx.getBean(“UserEbi“);BeanFactoryfactory factory=new ClassPathXmlApplicationC on
4、text(“applicationContext.xml“);Factory.getBean(“UserEb”)好处 (1:配置集中2:不用大量的工厂和单例3:配置 AOP 可以管理事物4;跟 Hibernate 集成后 session 不用管理)构造方法和 SET 方法到底该用哪个?参数比较少 用构造方法 参数比较多的时候用 SET 方法构造方法会在 new 实现的时候传进来已经 new 好了再传入进来就是一个是时机的问题Spring IOC 容器的关键点必须将管理的对象定义到 Spring 配置文件中必须定义构造函数或者是 SETTER 方法 让 Spring 讲对象注入进来 普通属性的注
5、入写一个 VO 提供 set 和 get 方法在 application 里边进行配置/标签非常灵活 也可以那样写wangjiandong /如果是 list 就用 list 标签,lsit1lsit2接下来写一个客户端Public class case extends TestCasePrivate BeanFactory factory Protected void setup()throws ExceptionFactory=new =new ClassPathXmlApplicationContext(“applicationContext.xml”);Public void test
6、()Bean1 bean 1=new (bean)factory.getBean(bean1);System.oyt.println(“bean1.se ”+bean1.getname();自定义属性编辑器(这个好向不长用 倒是后再查找吧) 继承 propertyeditosuppor 类 复写 setAsText(),将属性编辑器注册到 Spring 中日期的注入 写一个 VO 相应的 get setPublic Date dateVlue不能转化 不能把 DATE 转化成 string 得我们自己写一个属性编辑起+公共属性的注入 s通过标签定义公共的属性 指定 abstract=true具
7、有相同属性的类在,.标签中指定其 parent 属性-Bean 的作用域搞一个测试用例Public class ScopeFactory extends TestCasePrivate BeanFactory factory;Protected void setup() throws ExceptionFactory=new ClassPathXmlApplicationContext(“applicationContext.xml”);Public void testScopt()Bean1 bean11=new (Bean1)factoy.getBean(“bean1”);Bean1 be
8、an12=new (Bean1)factoy.getBean(“bean1”);If(bean11=bean12)Systemoutprintln(“bean11=bean12”);ElseSystemoutprintln(“bean11!=bean12”);默认情况下 是New 出一个对象,线程过来都是执行这个对象(每次调用都是同一个实例)如果设置成每个线程过来 new 一个对象(每次调用返回的是不同的实例)这样做能避免 ACTION 的线程安全问题根据名称自动装配和根据类型自动装配Defaultautowifre=byType 根据类型这个要好Defaultautowifre=byName
9、 根据名称”IOC 是 核心 提供了好多基础性的服务和第三方集成的方案以前是我们来管理的 关系 自己要实例化 现在我们吧我们做的事情让容器来完成,控制饭庄是一种是想 一种是依赖的查找,一种是依赖注入 提供一个标准的方法(构造和 SET)这样就没有依赖性的 ,那么这个 IOC 能带来什么好处呢,是个大型的抽象工厂,使用他使我们的层次更分明,对象我们不用管了,使我们程序中不出现的大量的单例和工厂AOP EJB( SessionBean )用 EJB 是做声明事物 Spring 出现了以后出现了 AOP 并不是一个新的技术,我们的 AOP最重要的一点就是提供声明服务,不用改代码声明一下就可以具有这种
10、能力,普通 JAVA对象是不继承任何类的,(POJO)代理模式是一种结构性的模式 可以 控制原对象不会改变原对象的接口静态代理 创建出来能看见的动态代理 是生成期代理可以控制源对象代理模式一个很显著的特点是跟目标对象的接口是一致的为什么要用代理呢?比如我们要做在 UserEbi 里边写了一个接口Public Boolean add(String id)在 UserEbo 里边实现 实现的时候我们要判断一下传进来的 Id 是不是具有某种权限 ,如果在 UserEbo 里边判断,这样就的改代码,这是时候我们可以弄一个代理出来,代理能够控制原对象,代理是跟目标对象的接口是一致的,我们可以写一个类,实
11、现同一个接口下边是一个例子public interface UserEbipublic void add(String id);public void delete(String id);Public class UserEbo implements UserEbipublic void add(String id);System.out.println(“id”+id);public void delete(String id2);System.out.println(“id”+id)2;Public class Userdaili implements UserEbiPrivate Use
12、rEbi userebi;Public Userdaili(UserEbi userebi;public void delete(String id2); Boolean check()System.out.println(“id”+id)2;public void add(String id); Boolean check()System.out.println(“id”+id);Public Boolean check()这样我们只要把检查方法 放在需要检查的类里,这样我们写的类里如果需要检查就会吧我们写的检查方法 分布在所有的代码里边;AOP 关注的不管对象管的是这些对象中,具有横切性的
13、问题,然后运行期间植入进去把横切性的关注点拿出来 模块化了,然后维护这个方法就好了 , (比如我们的判断方法,以前我们判断的是是不是 STRING 现在我们要判断是不是 INT,这个时候我们需要修改方法,然后再去使用使用这个方法的地放进行修改)这样修改的时候就节省大量的时间Spring AOP 的实现就是默认 JDK 的动态代理机制实现的(AOP 是 OO 的补充)接下来写一个动态代理:我们写一个类实现 InvocationHandlerPublic class SecurityHandler implements InvocationHandlerPrivate object targetO
14、bject;/把目标对象传进来,因为对目标对象进行代理Pubic object newPproxy(Object targetObject)this targetObject= targetObject;return ProxynewProxyTnstance (targetObject.getClass().getClassLoader;targetObject.getClass().getInterfaces;this) Public object invoke(Object proxy,Method method ,object args) /实现后重写的方法check();method
15、 相关细节查看视频吧Public void check()/检查方法AOP 是面向切面编程就是使用的时候关键是找到切入点,找到切入点然后模块化就面向切面了,安全性检查就是切入点,我们把它模块化放到一个类里,这个类就是切面,指定这个类是切面(以前我们是配置文件现在我们指定是切面,这就是注解的方式)Spring 指出的是方法的 pointcutPointcut 的实现采用 Annotation 的方式也就是注解的方式,就是程序注解一下就有这样那个的功能1:Spring 的依赖库2:定义切面(Aspect)3: 定义 pointcut 写一个依赖的方法(这个方法就是一个标识)point(“execu
16、tion (*add(*)”)/ASpectPublic class SecurityHandler/定义 pointcut ,pointcut 的名称就是 allAddMethod 此方法不能有返回值和参数,该方法只能是一个标识/pointcut 的内容是一个表达式,描述那些对象那些方法(订阅 Joinpoint)pointcut(“execution(*add*()”)Private void allAddMethod();/定义 advice 标识在哪个切入点何处植入这个方法/在所有的 Add 方法之前执行before (”allAddmethod()”)Private void che
17、ckSecurrity()/定义完了 Aspect 得配置一下 让 IOC 容器认识,Spring 的核心是 IOC ,在 Spring 的配置文件中: http:/www.springframework.org./schema/aop,http:/www.springframework.org/aop/spring-aop-2.0.xsd./.,/.,.加入.这样一句话2:启用/这个是我们的切面/把需要切面的类引入这样 Spring 就知道了在客户端 BeanFactory Factory=new ClassPathXmlApplicationContext(“applicationContext.xml”);UserManager userManager =(UserManager)factory.getBean(“userManager”);采用配置文件的方式在配置文件中配置Spring 和 Hibernate 集成 声明式事物1:配置 sessionFactory2;配置事物管理器3:配置事物的传播特性(隔离级别)4 哪些类哪些方法参与事物