首页 Spring个人学习笔记

Spring个人学习笔记

举报
开通vip

Spring个人学习笔记Spring_beginning Spring最常用的特性 l 利用Spring来创建对象(JavaBean工厂) l 利用Spring构建业务逻辑层 l 管理依赖关系 l 适应需求变更 l 利用Spring创建数据访问对象(DAO) l 利用Spring进行事务处理 环境搭建 1、spring依赖库 * SPRING_HOME/dist/spring.jar * SPRING_HOME/lib/jakarta-commons/commons-logging.jar * SPRING_HOME/lib/log4j...

Spring个人学习笔记
Spring_beginning Spring最常用的特性 l 利用Spring来创建对象(JavaBean工厂) l 利用Spring构建业务逻辑层 l 管理依赖关系 l 适应需求变更 l 利用Spring创建数据访问对象(DAO) l 利用Spring进行事务处理 环境搭建 1、spring依赖库 * SPRING_HOME/dist/spring.jar * SPRING_HOME/lib/jakarta-commons/commons-logging.jar * SPRING_HOME/lib/log4j/log4j-1.2.14.jar 2、拷贝spring配置文件到src下 applicationContext.xml 3、拷贝log4j配置文件到src下 log4j.properties 4、在UserManagerImpl中提供构造函数或setter 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ,spring将实例化好的UserDao实现注入给我们 5、让spring管理我们的对象创建和依赖,必须在spring配置中进行定义 6、编写客户端 //获取BeanFactory BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); //从容器中获取userManager对象 UserManager userManager = (UserManager)factory.getBean("userManager"); userManager.save("伟超", "1234"); spring Ioc容器的关键点: * 必须将被管理的对象定义到spring配置文件中 * 必须定义构造函数或setter方法,让spring将对象注入过来 l 只需改动ApplicationContext.xml的配置,即可实现实际功能的切换 IOC/DI l 控制反转(Inversion of Control,IoC)与依赖注入(Dependency Injection) l 由容器来管理对象之间的依赖关系(而不是对象本身来管理),就叫“控制反转”或“依赖注入” l 以上代码,已清楚阐述IOC/DI出现的原因,以及IOC的基本原理 l Spring框架的基本思想就是IOC/DI l Spring就是一个IOC容器 l IOC与DI,说的是一回事,但DI这个名词更能 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达这种设计模式的思想 依赖注入的类型 l 构造器注入 l 通过类的构造方法注入依赖关系 l 设值方法注入 l 通过类的setter方法注入依赖关系 l 第三种:接口注入(不常用) l 定义一个注入接口,在需要注入的类中实现此接口,由于这种方法具有侵入性,所以不常用 2. Injection 2.1 spring的普通属性注入    参见:spring文档3.3章节 2.2 什么是属性编辑器,作用? 2.2.1 自定义属性编辑器 自定义属性编辑器:spring配置文件中的字符串转换成相应的对象进行注入 心得:从此处可以看出,spring里面输入的都是字符串,但是可以更根据POJO设置的类型做相应的转换 spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器 2.2.2 如何定义属性编辑器? ①继承PropertyEditorSupport类,覆写setAsText()方法,参见:UtilDatePropertyEditor.java SimpleDateFormat sdf = new SimpleDateFormat(format); setValue(d); ②将属性编辑器注册到spring中,参见:applicationContext-editor.xml yyyy/MM/dd 2.3 依赖对象的注入方式 * ref属性 * 标签 * 内部来定义 如何将公共的注入定义描述出来? * 通过标签定义公共的属性,指定abstract=true * 具有相同属性的类在标签中指定其parent属性 参见:applicationContext-other.xml 2.4 spring Bean的作用域: scope可以取值:    * singleton:每次调用getBean的时候返回相同的实例 * prototype:每次调用getBean的时候返回不同的实例 3 Spring 对AOP(Aspect Oriented Programming)的支持 3.1 AOP相关 AOP的关注点是Cross cutting concern,比如下面的检查安全性,在通过配置关注点,可以不影响主程序,Aspect包含Pointcut(切入点注册)和advice(具体怎么切、实现) 3.2 采用Annotation的方式 3.3.1 spring依赖库 * SPRING_HOME/dist/spring.jar * SPRING_HOME/lib/jakarta-commons/commons-logging.jar * SPRING_HOME/lib/log4j/log4j-1.2.14.jar * SPRING_HOME/lib/aspectj/*.jar SecurityHandler.java(2、3、4)    3.3.2 采用Aspect定义切面 @Aspect public class SecurityHandler { @Pointcut("execution(* add*(..))") private void allAddMethod(){}; @Before(value="allAddMethod()") private void checkSecurity() { System.out.println("----------checkSecurity()---------------"); } } 3.3.3 在Aspect定义Pointcut和Advice /** * 定义Pointcut,Pointcut的名称就是allAddMethod,此方法不能有返回值和参数, * 该方法只是一个标识 * Pointcut的内容是一个表达式,描述那些对象的那些方法(订阅Joinpoint) */ @Pointcut(value="execution(* add*(..))") private void allAddMethod(){}; /** * 定义Advice,标识在那个切入点何处织入此方法 */ @Before(value="allAddMethod()") private void checkSecurity() { System.out.println("----------checkSecurity()---------------"); } 3.3.4、启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中 即Advice中通过方法名引用这个切人点 Client.java UserManager userManager = (UserManager)factory.getBean("userManager"); AOP: //这两个方法执行之前就会执行advice; userManager.addUser("张三", "123"); userManager.deleteUser(123); * Cross cutting concern * Aspect * Advice * Pointcut * Joinpoint * Weave * Target Object * Proxy * Introduction 3.3 采用静态配置文件 3.4 JointPoint参数介绍 Aspect默认情况下不用实现接口,但对于目标对象(UserManagerImpl.java),在默认情况下必须实现接口,如果没有实现接口必须引入CGLIB库 我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得参数值、方法名等等 private void checkSecurity(JoinPoint jp) { Object[] args= (Object[])jp.getArgs(); 3.5 JDK动态代理和CGLIB字节码生成(弱) 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/cglib/*.jar * 在spring配置文件中加入 JDK动态代理和CGLIB字节码生成的区别? * JDK动态代理只能对实现了接口的类生成代理,而不能针对类 * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成final    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class SecurityHandler implements InvocationHandler { private Object targetObject; public Object newProxy(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { checkSecurity(); Object ret = null; try { ret = method.invoke(this.targetObject, args); }catch(Exception e) { e.printStackTrace(); throw new java.lang.RuntimeException(e); } return ret; } private void checkSecurity() { System.out.println("----------checkSecurity()---------------"); } } public class Client { public static void main(String[] args) { //UserManager userManager = new UserManagerImpl(); SecurityHandler handler = new SecurityHandler(); UserManager userManager = (UserManager)handler.newProxy(new UserManagerImpl()); //userManager.addUser("张三", "123"); userManager.deleteUser(1); } } 4 Spring+Hibernate 4.1 采用编程式事务 参照:Spring_Hibernate1 1、getCurrentSession()与openSession()的区别?   线程绑定 session在commit或rollback时会自动关闭 getCurrentSession() 绑定到当前线程 自动关闭 openSession() 不会有绑定 必须手动关闭       2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置: * 如果使用的是本地事务(jdbc事务) thread * 如果使用的是全局事务(jta事务) jta        4.2 采用声明式事务 4.2.1 声明式事务配置 通过配置把Hibernate里面的事务管理(session)交给Spring以注入的方式完成 ① 配置SessionFactory 注入到Spring和Hibernate做集成的响应的类里面,——创建sessionFactory org.springframework.orm.hibernate3.LocalSessionFactoryBean"> classpath:hibernate.cfg.xml     ② 配置事务管理器 org.springframework.orm.hibernate3.HibernateTransactionManager">     ③ 事务的传播特性     ④ 那些类那些方法使用事务(事务边界) 4.2.2 编写业务逻辑方法 * 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是Hibernate Session的轻量级封装 public class LogManagerImpl extends HibernateDaoSupport implements LogManager { public void addLog(Log log) { getHibernateTemplate().save(log); } } * 把LogManagerImpl,UserManagerImpl,注入Spring配置文件 * 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的,但是Spring可以自己配置哪些异常回滚,哪些不回滚 * 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理 * 关于事务边界的设置,通常设置到业务层,不要添加到Dao上 4.2.3 了解事务的几种传播特性 1.    PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启 2.    PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行 3.    PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。 4.    PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。 5.    PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。 6.    PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常 7.    PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行 4.2.4  Spring事务的隔离级别 1.    ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 另外四个与JDBC的隔离级别相对应 2.    ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。 3.    ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 4.    ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 5.    ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 除了防止脏读,不可重复读外,还避免了幻像读。          5 Spring+Struts1 5.1 第一种集成 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 原理:在Action中取得BeanFactory对象,然后通过BeanFactory获取业务逻辑对象 5.1.1 spring和struts依赖库配置 * 配置struts --拷贝struts类库和jstl类库,WEB-INF的lib里面 --修改web.xml文件来配置ActionServlet --提供struts-config.xml文件,拷到WEB-INF下 --提供国际化资源文件,到src下 * 配置spring --拷贝spring类库 * SPRING_HOME/dist/spring.jar * SPRING_HOME/lib/jakarta-commons/commons-logging.jar * SPRING_HOME/lib/log4j/log4j-1.2.14.jar * SPRING_HOME/lib/aspectj/*.jar --提供spring配置文件 2、在struts的Action中调用如下代码取得BeanFactory web.xml配置,让servlet初始化的时候创建BeanFactory contextConfigLocation classpath*:applicationContext-*.xml org.springframework.web.context.ContextLoaderListener BeanFactory取得方法①: //        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-beans.xml"); BeanFactory取得方法② BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext (request.getSession() .getServletContext()); 第一种集成方案,依赖了BeanFactory; 3、通过BeanFactory取得业务对象,调用业务逻辑方法            5.2 第二种集成方案 原理: 1、将业务逻辑对象通过spring注入到Action中,从而避免了在Action类中的直接代码查询 2、因为Action需要调用业务逻辑方法,所以需要在Action中提供setter方法,让spring将业务逻辑对象注入过来 public class LoginAction extends Action { UserManager userManager; public void setUserManager(UserManager userManager) { this.userManager = userManager; } } 3、在struts-config.xml文件中配置Action * 标签中的type属性需要修改为:org.springframework.web.struts.DelegatingActionProxy源码: protected Action getDelegateAction(ActionMapping mapping) throws BeansException { WebApplicationContext wac = getWebApplicationContext(getServlet(), mapping.getModuleConfig()); String beanname = determineActionBeanName(mapping); return (Action) wac.getBean(beanName, Action.class); } DelegatingActionProxy是一个Action,主要作用是取得BeanFactory(WebApplicationContext),然后根据中的path属性值到IoC容器中取得本次请求对应的Action 4、在spring配置文件中需要定义struts的Action,如: ApplicationContext.xml: * 必须使用name属性,name属性值必须和struts-config.xml文件中标签的path属性值一致 * 必须注入业务逻辑对象 * 建议将scope设置为prototype,这样就避免了struts Action的线程安全问题 补充: 课程内容 1. 面向接口(抽象)编程的概念与好处 2. IOC/DI的概念与好处 a) inversion of control b) dependency injection 3. AOP的概念与好处 4. Spring简介 5. Spring应用IOC/DI(重要) a) xml b) annotation 6. Spring应用AOP(重要) a) xml b) annotation 7. Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2整合(重要) a) opensessionInviewfilter(记住,解决什么问题,怎么解决) 8. Spring JDBC 面向接口编程(面向抽象编程) 1. 场景:用户添加 2. Spring_0100_AbstractOrientedProgramming a) 不是AOP:Aspect Oriented Programming 3. 好处:灵活 什么是IOC(DI),有什么好处 1. 把自己new的东西改为由容器提供 a) 初始化具体值 b) 装配 2. 好处:灵活装配 Spring简介 1. 项目名称:Spring_0200_IOC_Introduction 2. 环境搭建 a) 只用IOC i. spring.jar , jarkata-commons/commons-loggin.jar 3. IOC容器 a) 实例化具体bean b) 动态装配 4. AOP支持 a) 安全检查 b) 管理transaction Spring IOC配置与应用 1. FAQ:不给提示: a) window – preferences – myeclipse – xml – xml catalog b) User Specified Entries – add i. Location:    D:\share\0900_Spring\soft\spring-framework-2.5.6\dist\resources\spring-beans-2.5.xsd ii. URI:          file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd iii. Key Type:    Schema Location iv. Key:        2. 注入类型 a) Spring_0300_IOC_Injection_Type b) setter(重要) c) 构造方法(可以忘记) d) 接口注入(可以忘记) 3. id vs. name a) Spring_0400_IOC_Id_name b) name可以用特殊字符 4. 简单属性的注入 a) Spring_0500_IOC_SimpleProperty b) 5. (隐式注册 post-processors 包括了 AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor, 也包括了前面提到的 RequiredAnnotationBeanPostProcessor。)   10. @Autowired e) 默认按类型by type f) 如果想用byname,使用@Qulifier g) 写在private field(第三种注入形式)(不建议,破坏封装) h) 如果写在set上,@qualifier需要写在参数上 11. @Resource(重要) a) 加入:j2ee/common-annotations.jar b) 默认按类型,名称找不到,按类型 c) 可以指定特定名称 @Resource(name="u") public void setUserDAO( UserDAO userDAO) { this.userDAO = userDAO; } d) 推荐使用 e) 不足:如果没有源码,就无法运用annotation,只能使用xml 12. @Component @Service @Controller @Repository a) 初始化的名字默认为类名首字母小写 b) 可以指定初始化bean的名字 13. @Scope 14.@PostConstruct = init-method; @PreDestroy = destroy-method; 什么是AOP 1. 面向切面编程Aspect-Oriented-Programming a) 是对面向对象的思维方式的有力补充 2. Spring_1400_AOP_Introduction 3. 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码 a) Filter b) Struts2的interceptor 4. 概念: a) JoinPoint b) PointCut c) Aspect(切面) d) Advice e) Target f) Weave Spring AOP配置与应用 1. 两种方式: a) 使用Annotation b) 使用xml 2. Annotation a) 加上对应的xsd文件spring-aop.xsd b) beans.xml c) 此时就可以解析对应的Annotation了 d) 建立我们的拦截类 e) 用@Aspect注解这个类 f) 建立处理方法 g) 用@Before来注解方法 h) 写明白切入点(execution …….) i) 让spring对我们的拦截器类进行管理@Component 3. 常见的Annotation: a) @Pointcut b) @Before c) @AfterReturning d) @AfterThrowing e) @After f) @Around 4. 织入点语法 a) void !void b) 参考文档(* ..) 5. xml配置AOP a) 把interceptor对象初始化 b) classpath:jdbc.properties jdbc.properties 文件: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring jdbc.username=root jdbc.password=bjsxt   2 Spring整合Hibernate 1) 整合步骤 a) i. struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* 11. 再加入spring的listener,这样的话,webapp一旦启动,spring容器就初始化了 org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:beans.xml   12. 规划struts的action和jsp展现 13. 加入struts.xml a) 修改配置,由spring替代struts产生Action对象 14. 修改action配置 a) 把类名改为bean对象的名称,这个时候就可以使用首字母小写了 b) @Scope(“prototype”)不要忘记 iii. struts的读常量: 15. struts-default.xml 16. struts-plugin.xml 17. struts.xml 18. struts.properties 19. web.xml iv. 中文问题: 20. Struts2.1.8已经修正,只需要改i18n.encoding = gbk 21. 使用spring的characterencoding 22. 需要严格注意filter的顺序 23. 需要加到Struts2的filter前面 v. LazyInitializationException 24. OpenSessionInViewFilter 25. 需要严格顺序问题 26. 需要加到struts2的filter前面
本文档为【Spring个人学习笔记】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_597436
暂无简介~
格式:doc
大小:115KB
软件:Word
页数:0
分类:互联网
上传时间:2020-02-04
浏览量:2