传智播客spring2.5视频配套PPT_黎活明(精)
- 格式:doc
- 大小:4.98 MB
- 文档页数:25
Spring2.5 注解介绍(3.0通用)注解说明•注册注解处理器•方式一:bean<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>•方式二: 命名空间<context:annotation-config /><context:annotationconfig /> 将隐式地向Spring 容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor 、 PersistenceAnnotationBeanPostProcessor 以及RequiredAnnotationBeanPostProcessor 这4 个BeanPostProcessor 。
•方式三: 命名空间<context:component-scan />如果要使注解工作,则必须配置component-scan ,实际上不需要再配置annotation-config。
base-package 属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。
还允许定义过滤器将基包下的某些类纳入或排除。
• Spring 支持以下4 种类型的过滤方式:•注解 org.example.SomeAnnotation 将所有使用SomeAnnotation 注解的类过滤出来•类名指定 org.example.SomeClass 过滤指定的类•正则表达式 com.kedacom.spring.annotation.web..* 通过正则表达式过滤一些类• AspectJ 表达式 org.example..*Service+ 通过AspectJ 表达式过滤一些类•正则表达式的过滤方式举例:<context:component-scanbase-package="com.casheen.spring.annotation"><context:exclude-filtertype="regex"expression="com.casheen.spring.annotation.web..*"/></context:component-scan>•注解的过滤方式举例:<context:component-scan base-package="qin" ><context:include-filter type="annotation"expression="org.springframework.stereotype.Controller"/><context:include-filter type="annotation"expression="org.springframework.stereotype.Service"/><context:include-filter type="annotation"expression="org.springframework.stereotype.Repository"/></context:component-scan>启用Spring MVC 注解•启动Spring MVC 的注解功能,完成请求和注解POJO 的映射• <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>注解介绍• @Controller• @Service• @Autowired• @RequestMapping• @RequestParam• @ModelAttribute• @Cacheable• @CacheFlush• @Resource• @PostConstruct• @PreDestroy• @Repository• @Component (不推荐使用)• @Scope• @SessionAttributes• @InitBinder@Controller•例如@Controllerpublic class SoftCreateController extends SimpleBaseController {}•或者@Controller("softCreateController")•说明@Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写@Service•例如@Servicepublic class SoftCreateServiceImpl implements ISoftCreateService {}•或者@Service("softCreateServiceImpl")•说明@Service 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写@Autowired•例如@Autowiredprivate ISoftPMService softPMService;•或者@Autowired(required=false)private ISoftPMService softPMService = new SoftPMServiceImpl();•说明@Autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。
Spring2.51.控制反转就是应用本身不负责依赖对象的创建和维护, 而交给外部容器,2.DI是运行期由外部容器动态的将依赖对象注入到组件中3.需要包含的jara)必须的i.dist/spring.jarii.lib/jakarta-commons/commons-logging.jarb)切面编程aop, 还需要以下jari.lib/aspectj/aspectjweaver.jar 和aspectjrt.jarii.lib/cglib/cglib-nodep-2.1.3.jarc)如果使用了注解i.lib/j2ee/common-annotations.jar4.实例化Spring有两种方式a)类路径i.b)文件路径i.ii.在不同操作系统下不通用c)可以通过数组指定多个配置文件5.可以新建JUnit Test case来做实验6.可以先写类, 再通过eclipse来抽取接口7.bean的属性a)name属性是id的加强, 可以包含特殊字符8.bean的获得ApplicationContext ctx = new ClassPathXmlApplicationContext(newString[]{"bean.xml"});PersonService personService = (PersonService)ctx.getBean("PersonService");a)personService.save();9.Spring实例化bean的方式a)使用类的构造方法实例化b)使用静态工厂实例化i.这时候在配置的时候class指定的是工厂类, 还要指定工厂方法c)使用实例工厂方法实例化i.先实例工厂, 再用该工厂来实例化bean10.bean的作用域a)默认为单例可以通过配置文件中该bean的里面lazy-init=”true”来延迟实例化, 这时只有第一次获得时, 才会实例化b)prototype是每一次都是获得新实例c)还有request , session , global session 可以在web应用中使用11.bean的生命周期a)默认的时候是在容器实例化的时候对bean进行实例化b)scope=prototype的时候, 是在调用的时候才会进行实例化c)初始化方法, 如DBAgent中的获得连接的方法i.可以在xml里面的bean里面配置init-methodii.这样bean在被外部容器实例化之后, 就会调用这个方法d)也可以通过destory-method来指定bean被销毁的时候, 应该去调用哪个方法12.依赖注入a)通过bean的property属性, 把xml里面另一个bean注入进去b)通过ref描述另一个beanc)集合类型对象的注入i.Set类型ii.iii.List类型iv.v.Properties类型vi.vii.Map类型viii.d)通过构造函数注入两个参数举例e)13.编写Spring配置文件, 如果无法连接到网络a)window prefemence MyEclipseEnterpriseWorkBench xml xmlCatalogb)右边 user special entries 然后addc)14.通过注解把类进行依赖注入a)如果要用注解, spring的xml的beans里面要加上<context:annotation-config/>b)@Autowired是按类型装配i.c)@Resource是按名称装配, 当找不到与名称匹配的bean时就会按类型装配, 而且是属于j2ee的, 没有与框架进行耦合i.@Resource可以加上属性上, 也可以加在的set方法上面15.使用ClassPath自动扫描技术把类纳入spring容器管理a)在spring的xml里面的beans里面加上<context:component-scanbase-package=""/> 已经加入14中的命名空间b)@Service是标注业务层对象i.后面加(“名子”)ii.加@Scope(作用范围)iii.可以在方法上加@PostConstruct表示初始化方法iv.加上@PreDestroy是表示销毁方法c)@Controller是标注控制层的, (如Struts中的action)d)@Repository是标注数据访问组件, 即Dao组件e)@Component是泛指组件f)使用的时候, getBean(里面是类的名字, 第一个字母小写)16.aop代理a)要想使用aop, 目标类必须面向接口(非spring)b)切面是横切性关注点的抽象c)连接点是被拦截器拦截到的点d)切入点是要对哪些连接点进行拦截的定义e)拦截后所做的事情是通知f)织入是将切面应用到目标对象并将代理对象创建的过程g)引入是指不修改代码的前提下, 可以在运行期动态的添加一些方法或fieldh)如果类实现了接口, 就会用JDKProxyFactory来实现aop, 如果没有实现接口, 就会用CGlibProxyFactory来实现接口17.用注解使用Spring的aopa)@Aspect声明切面b)@Pointcut声明切入点i.即执行业务方法时要进行拦截ii.@Pointcut (“execution(* com.xxp..*.*(..))”) 第一个*是返回值类型, 后面是包名, 两个点表示对子包的类也要进行拦截, 第二个*是表示要对哪个类进行拦截, 第三个*是代表方法; 后面括号里面的点, 是代表参数iii.采用定义方法来定义切入点的名称iv.可以声明多个切入点c)@Before定义前通知i.可以定义参数到通知@Before(“anyMethod()&&args(userName)”)d)@AfterReturning定义后置通知i.要声明返回就 ,returning=”result”)ii.并且把通知方法里面的参数改为String resulte)@AfterThrowingi.要得到目标方法抛出的意外 ,throwing=”e”)ii.并且把通知方法里面的参数改为String result18.用xml实现aopa)<aop:config>b)<aop:aspect id="asp" ref="aspetbean">c)<aop:pointcut id="mycut" expression="execution(*cn.itcast.service..*.*(..))"/>d)<aop:before pointcut-ref="mycut" method="doAccessCheck"/>e)<aop:after-returning pointcut-ref="mycut"method="doAfterReturning"/>f)<aop:after-throwing pointcut-ref="mycut"method="doAfterThrowing"/>g)<aop:after pointcut-ref="mycut" method="doAfter"/>h)<aop:around pointcut-ref="mycut"method="doBasicProfiling"/>i)</aop:aspect>j) </aop:config>19.Spring加JDBCa)配置数据源i.<bean id = “datasource”></bean>ii.配置mySql的url的时候, & 应该用 &b)配置事务i.如果要用注解来进行事务的声明,要在配置文件中加上<tx:annotation-driventransaction-manager="txManager"/>ii.txManager是一个事务管理器的bean:如1.<bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">2. <property name="dataSource" ref="dataSource"/>3. </bean>c)使用模板类i.在service类里面定义一个私有变量JdbcTemplate, 然后用DataSource的set方法来初始化它ii.私有变量DataSource就没有必要了20.如果抛出的是运行期例外(即RuntimeException)的话, 事务会回滚a)如果是Exception, 也就是需要try catch的意外, 是不会回滚的b)但是对于Exception, 可以通过@Transaction(RollbackFor=””) 来强制回滚21.使用注解进行事务管理和事务的传播属性@Transactional(propagation =Propagation.NOT_SUPPORED)a)在类和方法上面都要加@Transactionb)REQUIRED业务方法需要在一个事务中运行, 如果方法在运行时已经在一个事务中了, 就加入该事务, 否则为自己创建一个新的事务c)NOT_SUPPORED 声明该方法不需要一个事务, 如果该方法在事务中被调用, 事务会被佳起, 当该方法执行完后, 事务便会恢复执行d)REQUIRESNEW 该方法需要一个新的事务, 如果该方法是在事务中被调用, 那么原来的事务会被挂起, 等一个为这个方法所新建的事务创建并执行完成以后, 再继续从前的事务e)MANDATORY该属性指定业务方法只能在一个已经存在的事务中进行, 业务方法不能自己发起事务, 如果在没有事务的环境中被调用, 容器就会抛出意外f)SUPPORTS 如果方法在有事务的环境中被调用, 就会成为该事务的一部分, 如果在没有事务的环境中被调用, 就会在没有事务的环境中执行g)Never 指定方法绝对不能在事务的范围内执行,22.数据库系统的四种隔离级别a)读未提交数据会出现脏读(读到另一事务未提交的数据)b)读已提交数据会出现不可重复读(后继读取可以读到另一事务已经提交的数据)和幻读c)可重复读会出现幻读(一个事务读到另一事务提交的insert数据)d)串行化23.使用xml配置事务a)<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">b) <property name="dataSource" ref="dataSource"/>c) </bean>d)e)<aop:config>f)<aop:pointcut id="transactionPointcut" expression="execution(*cn.itcast.service..*.*(..))"/>g)<aop:advisor advice-ref="txAdvice" pointcut-ref="h)transactionPointcut"/>i)</aop:config>j)<tx:advice id="txAdvice" transaction-manager="txManager">k) <tx:attributes>l) <tx:method name="get*" read-only="true" propagation="m)NOT_SUPPORTED"/>n) <tx:method name="*"/>o) </tx:attributes>p)</tx:advice>24.Spring2.5 + Hibernate3.3 + Struts1.3整合开发a)spring中的antlr 与 struts中的antlr会冲突b)Spring容器的实例化i.手工编码ii.交给web容器, 这时Spring的配置文件要放到web根目录下面, 也可以通过配置参数classpath来指定从类路径下寻找1.<context-param>2. <param-name>contextConfigLocation</param-name>3. <param-value>classpath:beans.xml</param-value>4.</context-param>5.<!-- 对Spring容器进行实例化 -->6.<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>7.</listener>iii.如果是交给web容器的, 以后就可以从servletContext中取出来iv.c)想更好的集成, 就应该把Action交给Spring管理, 不然每次都要在action中获得Spring上下文i.在struts中把RequestProcess换掉就可以了25.Struts2.0.14a)struts2.0.14中的spring-core-2.0.5.jar、spring-context-2.0.5.jar、spring-beans-2.0.5.jar、spring-web-2.0.5.jar与spring2.5.6中的spring.jar会冲突,应把spring-core-2.0.5.jar、spring-context-2.0.5.jar、spring-beans-2.0.5.jar、spring-web-2.0.5.jar删除。