spring的有关学习知识总结
- 格式:docx
- 大小:27.50 KB
- 文档页数:13
spring的有关学习知识总结
1.spring是什么?
1)它是为属性赋值的一种工具(IOC||DI)
当希望一个类调用其它类的的方法时,
当在写一个vo时也经常为属性赋值。
2)它是用来处理系统级服务的一种工具(aop)
当程序的很多地方都需要同一个服务时,你该怎么办呢?方法调用,不管采用哪种方式,你的程序总要和被调用程序耦合到一起。为了解决这样问题,spring 提出了自己的方案,什么样的解决方案以后再讲。
3)MVC框架(spring提供了自己MVC模式)
4)集成常用框架(hibernate,struts)
5)提供了JDBC和DAO的样板代码
6)轻量级的框架(整个jar包1M多一点,并且开支非常小)
7)非侵入性框架(spring开发出来的项目一般不依赖spring)
2.spring是如何为类的属性赋值的呢?
它是通过ApplicationContext实现的,那么这个类如何实现的呢,通过xml
文件(applicationContext->实例化对象画图)。
3.实例
4.理解IOC(获得依赖对象的方式发生反转)依赖注入(Dependency Injection) 容器
通过上面实例,在为属性赋值时,不是有由程序自己为属性赋值而是由spring 的类ApplicationContext赋值,这种赋值方式有传统的方法改为spring方式,也就是说赋值的方式发生反转了。这就是反转控制(Inversion Of Control) 5.赋字符串及基本类型,类对象,内部bean,List或数
组,Set,map,Properties,null
6.以上程序为属性赋值时,全是生成了get方法和set方法,也就是说spring
在赋值时,通过set方法为属性赋值,spring不仅能通过set方法赋值还能通过构造方法为属性赋值。下面就讲一下,通过构造方法为属性赋值。
表示为构造方法传递一个参数值,
那么多参数的构造方法spring如何确定参数的顺序,知道我们可以通过
index(从0开始)或通过type(类型的全路径)
6.构造与set方法的选择
使用set方法比较常用,简单,但是通过set方法赋值的对象不具有强制性,构造方法具有强制性,实例化之后的对象肯定能够使用。
7.自动赋值
需求:作为程序本身在配置文件中不想手动为属性赋值咋办呢?为此spring提供了四种自动赋值方法。byName(根据属性名到上下文中找相同的
id),byType(根据属性类型到上下文中找相同的类型),constructor(根据提供的构造方法到上下文中找相同类型的值进行匹配),autodetect(试图先按constructor,如果不行再按byType)
default-autowire 默认认情况下不会自动装配
8.初始化方法和消毁方法
init destroy
需求:当spring根据property或构造方法赋完值,如果还需要更改对象里面的值或初始化值该怎么办呢?init
当spring容器(ApplicationContext)消毁bean时,我想释放掉一些资源,(连接对象)destroy
9.对Bean进行后处理器类
需求:对象实例化之后,如何做到对xml中的每一个类中的String类型的数据进行统一更改
在后处理器中,一定要返回更改之后的对象(干什么,为什么)
10.对bean工厂进行后处理(对ApplicaitonContext) 需求:在ApplicaitonContext加载完所有bean的定义信息之后,在实例化bean 之前,想对ApplicaitonContext做一些后理工作,该怎么办呢(当配值文件中使用占位符时,可以替换成资源文件中的信息)
11.spring提供的bean工厂后处理器
需求:在为其它属性赋值时,它的值要来自于资源文件怎么办呢?PropertyPlacehoderConfigurer(分散配值)
需求:在连接类中,如何做到为连接类的属性url,userName,password赋值呢,并且这些值来自于属性文件(.properties)?为了达到此目的,我们需要PropertyPlacehoderConfigurer类加载属性文件,然后再用占位符为
url,password赋值。
13.属性编辑器
需求:如何把普通的字符串赋给一vo对象呢。为了解决这个问题,我们可以定义一个属性编辑器实现类型转换
继承PropertyEditorSuport(setAsText)
setValue()
为了告诉spring把字符串赋给vo对象,需要配置
CustomEditorConfigurer(customEditors),实现类型到编辑器的映射。
14.获取国际化信息
需求:如何按照不同local显示不同的信息
id="messageSource"
class="org.springframework.context.support.Resour
ceBundleMessageSource">
app
14.发布事件,监听事件
需求:在应用中,我们做注册用户信息时,如果用户已经存在的话,我们可以发布一个事件,告诉客户此用户已存在,用来做集中处理所有事件。 在创建事件类时,一定要继承ApplicationEvent.
在spring中,如何发布事件呢ctx.publishEvent();
如何接收发布过来的事件呢。实现ApplicationListener
15.在StuConnection类中,自己何知道类的id是什么呢?
实现BeanNameAware接口(bean名关注)(做日志)
在类中,如何做到ApplicationContext发布事件呢?ApplicationContextAware(select)
16.单例bean 原型bean
17.总结:spring的作用是什么呢?它用来建立和存储类及类之间的关系(ApplicationContext,容器)。
18.Bean的生命周期(容器中的类可用之前所经过的过程)
实例化对象-->根据配置文件为属性赋值-->如果类实现BeanNameAware会调用setBeanName方法-->如果实现ApplicationContextAware会调用setApplicationContext-->如果实现BeanPostProcessor会调用postProcessBeforeInitialization()方法-->调用init方法-->调用后处理器的postProcessAfterInitialization方法
当容器闭时调用distroy方法.
二.面向切面(方面)编程(AOP)Aspect-Oriented Programming
1.spring是用来处理系统级服务的一种工具
系统级服务:当运行项目时,在控制台大家都能看到很多日志信息,这些日志功能在整个系统(项目)中到处使用。这个日志功能就是其中一种系统级服务。那么spring是如何把系统级服务放到方法上的呢?看图
2.实例(为某个类运用方法前通知)
java.util.logging.Logger log=Logger.getAnonymousLogger();
/doc/e93643460.html,("运行开始.....");
方法后通知,周围通知(环绕通知)
3.总结几个概念
1)通知,切面,目标对象,代理对象,织入(编译期,类装载期,运行期),切入点,接入点(连接点)。
2)spring只支持方法连接点,代理对象是运行时创建的。
代理对象的创建有两种方式:proxy,cglib
3)spring把采用这种机制的方式称为面向切面(方面)编程
4)为一个类运用通知需要创建一个代理对象,那么为多个类运用通知,应该创建几个代理对象呢?
3.切入点(放置通知的条件)
需求:在我们把通知(系统服务)运用到StuModel上方法时,是为所有方法都运用了通知,那么,如果我想只给StuModel的save方法运用通知(系统服务)该怎么办呢?那么这个时候,我们就需要定义一个类,这个类专门用来告诉spring要为某个方法添加系统服务。那么这个类就叫切入点类(或者说在哪一点放置通知)。
那么如何定义一个切点类呢?为此spring提供了Pointcut接口,作为程序员,只需要实现这个接口就可以了。作示例实现Pointcut接口。
从实现类中发现我们还需要创建两个类,一个类是判断类是否符合添加通知的要求。另外一个类是告诉spring方法是否符合添加通知,只有两者都符合才能为我们的类添加通知。作示例实现ClassFilter和MethodMatcher接口。
4.advisor
需求:大家想想为了为StuModel运用通知,只有切入点行吗?很显然,还需要一个通知类。只有切入点和通知共同运用到我们的类上面,才会能为某个方法添加通知。所以现我们需要把切入点类和通知类合到一起创建一个类(实现PointcutAdvisor接口)--advisor类,示例
5.动态切入点
看一看切入点类,在类中一个isRuntime方法,如果这个方法返回true表示会调用具有三个参数的那个方法,在这个方法中我们可以根据调用方法时传过来的参数值来决定是否运用通知。这个切入点类就叫动态切入点。如果没有这么做的话就叫静态切入点. 6.大家知道手动创建advisor需要很多步,为了避免这样的麻烦spring为我们提供了一个静态的advisor类。
NameMatchMethodPointcutAdvisor(advice,mappedNames)类,这个类能根据方法名来添加通知,示例
7.RegexpMethodPointcutAdvisor根据正规则表达式
8.创建引入
需求:如何为StuModel额外添加一个selectOne方法呢?
如果想达此目的,就需要学习引入通知
为了实现把selectOne方法添加到StuModel中,spring提供了DelegatingIntroductionInterceptor类,只要把需要的添加的方法通过接口(IOne)告诉它就行了,然后把这个类以通知的方式运用到proxy类上,别忘了让代理类实现IOne接口,示例
创建引入通知还有一种方法,实现IntroductionInterceptor接口,在此接口需要实现两个方法invoke,implementsInterface
有了通知它可以和advisor联合到一起(DefaultIntroductionAdvisor)
9.自动创建代理对象
需求:大家知道,如果想为你的类添加系统服务(通知)的话,就必须通过ProxyFactoryBean类创建代理对象才能实现,那么对象一个大型的项目可能要为很多类添加系统服务,如果这样,我们需要创建很多代理类对象,也是一件很麻烦的事情。那么,如何让spring自动创建代理呢,作为程序员不需要创建代理类对象呢?
为了达到这个目的,spring提供了BeanNameAutoProxyCreator类(interceptorNames,beanNames)。这个类能根据id名自动创建代理对象,并把系统服务添加到StuModel上。示例
三、spring操作数据库
1.spring编程理念
1)在进行方法调用时,通过接口来调用方法(通过接口来公开数据库访问类(DAO)中的所有方法)调用你操作数据的方法,体现松耦合.