spring通俗易懂.docx
- 文档编号:30549504
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:51
- 大小:1.64MB
spring通俗易懂.docx
《spring通俗易懂.docx》由会员分享,可在线阅读,更多相关《spring通俗易懂.docx(51页珍藏版)》请在冰豆网上搜索。
spring通俗易懂
Spring容器
一.Spring快速入门
文件头约束:
D:
\spring3_day1\spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html
1.使用反转控制注入值。
头文件位置:
\spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html
下面的:
xsd-config.xml.
ApplicationContextapplication=
newClassPathXmlApplicationContext("beans.xml");
HelloServicehello=(HelloService)application.getBean("helloSpring");
System.out.println(hello);
Property标签里面name属性就是javabean里面需要注入属性值的属性。
Value就是要注入的值。
HelloBean依赖info进行注入。
2.使用类构造器注入
使用默认的默认的构造函数。
ApplicationContextapplication=
newClassPathXmlApplicationContext("beans.xml");
Bean1bean1=(Bean1)application.getBean("bean1");
System.out.println(bean1);
运行结果:
cn.itcast.springdayone.Bean1@1fcc0a2
结果分析:
从结果可以看出,调用了Bean1的构造函数,获取了bean1的实例,类构造器进行注入实例成功。
3.三种实例化Bean的方式。
1.第一种就是使用类构造器方式进行注入,就是上面这种方式。
2.第二种:
静态工厂实例化。
ApplicationContextapplication=
newClassPathXmlApplicationContext("beans.xml");
Bean2bean2=(Bean2)application.getBean("bean2");
System.out.println(bean2);
运行结果:
cn.itcast.springdayone.Bean2@9a9b65
结果分析:
通过实例化静态工厂,调用工厂静态方法获取对象实例。
3.使用实例工厂方式实例化。
4.Spring的作用域。
1.Bean的id属性和name属性。
●id属性在Ioc容器中必须唯一。
●name属性在Ioc容器中可以不唯一,一般情况下就使用id属性即可。
但是如果含有特殊字符时,就需要使用name属性。
如果name属性相同,那么后面的name属性将会覆盖前面的name属性。
②.Singleton单例Bean。
测试:
结果:
cn.spring.bean.Bean1@d4d66b
cn.spring.bean.Bean1@d4d66b
这两个对象的地址一模一样。
单例模式证明完毕。
③.原型模式:
prototype.
结果:
cn.spring.bean.Bean1@c2ee15
cn.spring.bean.Bean1@19cd75a
发现其地址完全不一样。
这就是原型(多例)模式。
5.Spring中Bean的生命周期.
①.定义Bean时,可以Init-method,destroy-method.
运行结果:
LifeCycle初始化。
。
。
。
。
cn.spring.bean.lifecycle.LifeCycle@149105b
发现:
运行完程序,销毁方法没有执行。
解析:
这个程序运行了,但是Spring容器并不知道何时销毁。
举个例子:
例如把一个Spring容器交给tomcat管理时,tomcat停止时,他就会自动调用destroy方法。
那么我们就自己来调用这个方法:
app.close();
这时就会调用销毁方法:
LifeCycle初始化。
。
。
。
。
cn.spring.bean.lifecycle.LifeCycle@149105b
LifeCycle销毁。
。
。
。
。
②.Spring生命周期11步.
●instantiatebean对象实例化
●populate(移植)properties(属性)封装属性
●如果Bean实现BeanNameAware执行setBeanName
●如果Bean实现BeanFactoryAware或者ApplicationContextAware设置工厂setBeanFactory或者上下文对象setApplicationContext
●如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization,BeanPostProcessor接口提供钩子函数,用来动态扩展修改Bean。
(程序自动调用后处理Bean)
packagecn.spring.bean.lifecycle;
importorg.springframework.beans.BeansException;
importorg.springframework.beans.factory.config.BeanPostProcessor;
publicclassMyBeanPostProcessorimplementsBeanPostProcessor{
publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)
throwsBeansException{
System.out.println("第八步:
后处理Bean,after初始化。
");
//后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。
returnbean;//返回bean,表示没有修改,如果使用动态代理,返回代理对象,那么就修改了。
}
publicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)
throwsBeansException{
System.out.println("第五步:
后处理Bean的:
before初始化!
!
");
//后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。
returnbean;//返回bean本身,表示没有修改。
}
}
注意:
这个前处理Bean和后处理Bean会对所有的Bean进行拦截。
●如果Bean实现InitializingBean执行afterPropertiesSet
●调用
●如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization
●执行业务处理
●如果Bean实现DisposableBean执行destroy
●调用
代码实现:
packagecn.spring.bean.lifecycle;
importorg.springframework.beans.BeansException;
importorg.springframework.beans.factory.BeanNameAware;
importorg.springframework.beans.factory.DisposableBean;
importorg.springframework.beans.factory.InitializingBean;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;
publicclassLifeCycleBean1implementsBeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean{
privateStringinfo;
publicLifeCycleBean1()
{
System.out.println("第一步:
构造Bean实例!
");
}
publicStringgetInfo(){
returninfo;
}
publicvoidsetInfo(Stringinfo){
System.out.println("第二步:
依赖注入属性。
");
this.info=info;
}
publicvoidsetBeanName(StringbeanId){
//TODOAuto-generatedmethodstub
System.out.println("第三步:
实现BeanNameAware接口,会注入Beanid:
"+beanId);//实现BeanNameAware接口,通过setBeanName注入beans.xml文件中的id属性,配置文件在下面:
参考输出lifeCycleBean1,即输出配置文件中的id属性。
}
publicvoidsetApplicationContext(ApplicationContextapplicationContext)
throwsBeansException{
//TODOAuto-generatedmethodstub
System.out.println("第四步:
实现ApplicationContextAware接口,会注入ApplicationContext对象:
"+applicationContext);
}
publicvoidafterPropertiesSet()throwsException{
//TODOAuto-generatedmethodstub
System.out.println("第六步:
属性设置完成!
");
}
publicvoidmyinit()
{
System.out.println("第七步:
配置文件配置的初始化方法!
init-method='myinit'");
}
//Bean初始化完毕,如果有业务方法,那么就开始执行,以下方法模拟业务方法。
@Override
publicStringtoString(){
System.out.println("第九步:
业务处理!
!
");
return"LifeCycleBean1[info="+info+"]";
}
//destroy方法必须自己调用closed方法后才会执行。
publicvoiddestroy()throwsException{
//这个destroy无需配置,实现这个接口,就会自动的去调用destroy方法。
System.out.println("第十步:
执行销毁");
}
publicvoidmydestroy()
{
System.out.println("第十一步:
执行自定义销毁");
}
}
配置文件:
运行结果:
第五步:
后处理Bean的:
before初始化!
!
第八步:
后处理Bean,after初始化。
第五步:
后处理Bean的:
before初始化!
!
第八步:
后处理Bean,after初始化。
第五步:
后处理Bean的:
before初始化!
!
第八步:
后处理Bean,after初始化。
第五步:
后处理Bean的:
before初始化!
!
第八步:
后处理Bean,after初始化。
第五步:
后处理Bean的:
before初始化!
!
LifeCycle初始化。
。
。
。
。
第八步:
后处理Bean,after初始化。
第一步:
构造Bean实例!
第二步:
依赖注入属性。
第三步:
实现BeanNameAware接口,会注入Beanid:
lifeCycleBean1
第四步:
实现ApplicationContextAware接口,会注入ApplicationContext对象:
org.springframework.context.support.ClassPathXmlApplicationContext@157c2bd:
startupdate[FriNov1513:
40:
32CST2013];rootofcontexthierarchy
第五步:
后处理Bean的:
before初始化!
!
第六步:
属性设置完成!
第七步:
配置文件配置的初始化方法!
init-method='myinit'
第八步:
后处理Bean,after初始化。
第九步:
业务处理!
!
LifeCycleBean1[info=第二步:
配置文件注入!
]
分析:
前面前处理Bean和后处理Bean被执行多次,表示:
钩子函数会对每个bean进行拦截(前面已经配置了其他的几个Bean,每个Bean都执行2次前处理Bean后处理bean)。
故而执行多次,反复连续的输出五,八。
后面的destroy方法没有执行:
如果交给tomcat管理spring,那么tomcat会自动关闭Spring,那么销毁方法就会执行。
那么在这里,我们只是测试一下方法,并没有tomcat来管理,故而需要自己来管理自己手动关闭Spring。
调用close方法。
③.Spring依赖注入Bean的属性.
为一个对象注入一个属性的值有三种方式:
●构造函数注入
●使用setter方法注入,在Spring配置文件中,通过
●使用
代码演示如下:
●如何把一个prototype类型注入singleton中。
就像上面:
在car类配置文件里面加入:
scope=”prototype”,这是错误的。
那么下面解决方案如下:
使用lookUp方法注入:
●继承,如果多个Bean具有相同的方法和属性,则可以引入父类Bean,配置父子bean关系
抽取公共属性,下面需要变化的只需覆盖上面的即可。
这与java类之间没有任何关系,这不是类的继承。
这里至始至终只有一个类:
记住:
这是Bean之间的继承:
只有下面一个类。
●依赖,一个类内部运行依赖另一个Bean初始化一些数据
ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。
因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
至于ApplicationContext.xml这个配置文件部署在哪,如何配置多个xml文件,书上都没怎么详细说明。
现在的方法就是查看它的API文档。
在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。
看看它的API说明
第一段说明ContextLoader可以由ContextLoaderListener和ContextLoaderServlet生成。
如果查看ContextLoaderServlet的API,可以看到它也关联了ContextLoader这个类而且它实现了HttpServlet。
这个接口
第二段,ContextLoader创建的是XmlWebApplicationContext这样一个类,它实现的接口是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext->
BeanFactory这样一来spring中的所有bean都由这个类来创建
第三段,讲如何部署applicationContext的xml文件,如果在web.xml中不写任何参数配置信息,默认的路径是"/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。
如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:
viewplaincopytoclipboardprint?
/WEB-INF/classes/applicationContext-*.xml
/WEB-INF/classes/applicationContext-*.xml
在
上面的applicationContext-*.xml采用通配符,比如这那个目录下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都会一同被载入。
由此可见applicationContext.xml的文件位置就可以有两种默认实现:
第一种:
直接将之放到/WEB-INF下,之在web.xml中声明一个listener、
第二种:
将之放到classpath下,但是此时要在web.xml中加入
按照Struts2整合spring的官方给出的档案,写成:
viewplaincopytoclipboardprint?
--ContextConfigurationlocationsforSpringXMLfiles-->
applicationContext-*.xml
解释classes含义:
1.存放各种资源配置文件eg.init.propertieslog4j.propertiesstruts.xml
2.存放模板文件eg.actionerror.ftl
3.存放class文件对应的是项目开发时的src目录编译文件
总结:
这是一个定位资源的入口
如果你知道开发过程中有这么一句话:
惯例大于配置那么也许你会改变你的想法
对于第二个问题
这个涉及的是lib和classes下文件访问优先级的问题:
lib>classes
对于性能的影响应该不在这个范畴
classpath和classpath*区别:
classpath:
只会到你的class路径中查找找文件;
classpath*:
不仅包含class路径,还包括jar文件中(class路径)进行查找.
6.Spring的注解方式。
●使用Component进行注解。
注意:
Component(“hello”)相当于
代码如下:
●使用Autowired进行注入:
Spring默认按照类型进行注入
代码如下:
7.Spring3.0的注解。
●Spring3.0以JavaConfig为核心,提供使用Java类定义Bean信息的方法
•@Configuration指定POJO类为Spring提供Bean定义信息
•
@Bean提供一个Bean定义信息
●Spring提供AnnotationConfigApplicationContext用于加载使用@Configuration配置注解工厂类
●register方法用于向注解上下文对象添加一个配置类
●refresh刷新容器以应用这些注册的配置类
8.传统XML和注解配置混合使用
●1、引入context命名空间
//www.springframework.org/schema/beans" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xmlns: context="http: //www.springframework.org/schema/context" xsi: schemaLocation="http: //www.springframework.org/schema/beans http: //www.springframework.org/schema/beans/spring-beans.xsd http: //www.springframework.org/schema/contexthttp: //www.springframework.org/schema/context/spring-context.xsd"> ●2、在配置文件中添加context: annotation-config标签 annotation-config/> 使@Resource、@PostConstruct、@PreDestroy、@Autowired注解生效 注意: 在这里我们没有使用 component-scan/>这个扫描配置。 那么我们需要手动配置Bean,然后使用Autowired进行自动寻找类型
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- spring 通俗易懂
![提示](https://static.bdocx.com/images/bang_tan.gif)