- 浏览: 1589876 次
- 来自: 上海
文章分类
- 全部博客 (374)
- Java (101)
- Struts (54)
- Oracle (30)
- JavaScript (16)
- Spring (27)
- Hibernate (16)
- MyEclipse (3)
- JSF (1)
- FreeMarker (2)
- SiteMesh (2)
- JfreeChart (2)
- Ibatis (2)
- JSP (12)
- MyBatis (4)
- SWFupload (1)
- EJB (4)
- Jboss (4)
- WebService (2)
- Linux (16)
- Android (2)
- XML (6)
- Java 网络编程 (13)
- AXIS2 (1)
- FTP (1)
- Jswing (1)
- Socket (3)
- 杂文选集 (6)
- solr (2)
- PS (1)
- Tomcat (7)
- JDBC (9)
- Highcharts (1)
- maven (1)
- Nodejs (0)
- navicat (2)
- Exception (5)
- eclipse (3)
- jQuery (1)
- springMVC (4)
- MySQL (11)
- SVN (1)
- Sql Server (1)
- zookeeper (1)
- JVM (1)
- Groovy (2)
- Git (1)
- Nginx (1)
- DynamicReport (1)
- IDEA (2)
- JasperReports (1)
- Postgresql (2)
- Mac (1)
- gradle (1)
- 数据结构算法 (1)
最新评论
-
hpu145:
引用引用
java 千分位的添加和去除 -
被遗忘的下路:
少了个junit-4.8.2的包
SSH2整合完整案例(四十三) -
白天看黑夜:
java过滤emoji字符处理,希望能帮到你http://ww ...
emoji 表情图片解决方法 -
caipeiming:
这个挺好JavaScript实现input输入框控件只允许输入 ...
js 控制文本框只能输入中文、英文、数字等 -
双子树:
东西太好啦受教啊
Struts2 JSP中将list,set ,Map传递到Action然后<s:iterator>遍历(三十五)
深入理解Spring容器中的bean
使用抽象bean
spring的bean继承和java中继承完全不一样
容器中的工厂bean:
1和前面介绍的静态工厂创建bean和实例工厂创建bean有区别,这里的工厂bean是spring中一种特殊的bean,该工厂bean必须实现FactoryBean接口,而且实现后的bean
只能作为工厂bean使用.
2.而且通过getBean()来获取工厂bean的时候返回的不是FactoyBean,而是工厂bean生产的java
实例
3.如果要获取 factoryBean 要在bean的id 前面加上 "&"
获取bean在配置文件中ID
实现BeanNameAware 的setBeanName(String name);
容器中bean的生命周期
1.spring可以管理singleton 作用域的bean的生命周期,spring可以精确的知道该bean何时被创建,何时初始化完成,容器何时销毁该bean.
2.对于prototype的bean.spring只负责创建,之后,完全交割客户端代码,容器不在跟踪其生命周期.
依赖关系注入之后的行为 spring提供了两种方式完成
1.使用init-mehtod
2.实现initializingBean 接口
3.如果这两个都写了, 会先执行 initialingBean 接口的方法 然后执行 init-method
Bean销毁之前的行为
1.使用 destory-method
2.实现despoableBean接口
使用抽象bean
1.抽象bean被作为一种模板,在spring中被应用,在ApplicationContext初始化的时候,不会初始化抽象bean, 因此抽象bean的配置中可以没有 class. 2.抽象bean的作用主要是为了减少配置文件中多个bean之间拥有的重复的配置. 3.子bean无法从父bean中继承如下属性:depends-on,autowire,singleton,scope,lazy-init 4.如果 父bean写了class 则 子bean可以不用写class 和父类共用同一个实现类. 5.如果 父bean没有写class,则子bean必须写class 6.如果 父bean写了class,子bean也写了class,子bean覆盖 父bean的属性
<!-- 抽象bean --> <bean id="personTemplate" class="cn.sh.springmvc_java.Chinese" abstract="true"> <property name="axe" ref="stoneAxe_sf"/> </bean> <bean id="personTemplate1" abstract="true"> <property name="axe" ref="steelAxe_sf"/> </bean> <!-- 子bean继承 --> <bean id="china_child" parent="personTemplate"/> <!-- 子bean 覆盖父类的bean --> <bean id="china_child1" parent="personTemplate"> <property name="axe" ref="steelAxe_sf"/> </bean>
spring的bean继承和java中继承完全不一样
1.spring中子bean和父bean可以是不同的类型,但java中继承可以保证子类是一种特殊的父类 2.spring中的bean的继承是实例之间的关系,因此主要表现为参数的延续;而java中的继承是类之间的关系,主要表现在方法和属性的延续 3.spring中子bean不可以作为父bean使用,不具备多态性,java中的子类实例完全可以当成父类实例使用
容器中的工厂bean:
1和前面介绍的静态工厂创建bean和实例工厂创建bean有区别,这里的工厂bean是spring中一种特殊的bean,该工厂bean必须实现FactoryBean接口,而且实现后的bean
只能作为工厂bean使用.
2.而且通过getBean()来获取工厂bean的时候返回的不是FactoyBean,而是工厂bean生产的java
实例
3.如果要获取 factoryBean 要在bean的id 前面加上 "&"
package cn.sh.springmvc_java.factory; import org.springframework.beans.factory.FactoryBean; import cn.sh.springmvc_java.American; import cn.sh.springmvc_java.People; /** * 采用 spring的工厂bean:默认 是singleton * */ public class PeopleFactory1 implements FactoryBean<People>{ //People p=null; //这个方法只调用一次, 因为 scope="singleton" 如果prototype 就会每次调用 @Override public People getObject() throws Exception { /* // TODO Auto-generated method stub if(p==null){ p=new American(); }*/ System.out.println("1"); return new American(); } @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return American.class; } @Override public boolean isSingleton() { // TODO Auto-generated method stub return true; } }
<!--可以去掉prototye 属性,这样 就是默认的单例了--> <bean id="people" class="cn.sh.springmvc_java.factory.PeopleFactory1" scope="prototype"/>
/** *测试 采用 factoryBean 创建的对象 发现获取不了配置ID * xml创建的对象 可以获取配置时候的id */ @Test public void test13(){ ApplicationContext act=new ClassPathXmlApplicationContext("classpath*:applicationContent.xml"); People p=act.getBean("people",People.class); System.out.println(p.sayHello("Mary")); System.out.println(p.sayGoodBye("Mary")); People p1=act.getBean("people",People.class); System.out.println(p==p1); //单例就为true 否则为false //获取 factoryBean 本身 System.out.println(act.getBean("&people")); System.out.println(p.getClass()); p.toString(); People pa=act.getBean("american",People.class); System.out.println(pa.sayHello("Mary")); System.out.println(pa.sayGoodBye("Mary")); pa.toString(); //会打印出 配置的id }
获取bean在配置文件中ID
实现BeanNameAware 的setBeanName(String name);
package cn.sh.springmvc_java; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; /** * BeanNameAware 实现后,可以获取该bean的定义时的id * InitializingBean 实现后,可以在 spring初始化Bean完成后,执行指定的方法 * DisposableBean :Bean在被销毁前,执行特点的方法 * * 注意: DisposableBean的 destory 方法 和 配置文件中的destory-method 只对scope的 singleton Bean有用 * 可以将 Beans 的 default-init-method 和 default-destory-method和Bean的 方法 联合起来用 */ public class American implements People,BeanNameAware,InitializingBean,DisposableBean { private String beanName; @Override public void setBeanName(String name) { // TODO Auto-generated method stub System.out.println("执行BeanNameAware 的set方法 获取BeanName"); this.beanName=name; } @Override public String sayHello(String name) { // TODO Auto-generated method stub return name+",hello"; } @Override public String sayGoodBye(String name) { // TODO Auto-generated method stub return name+",Good Bye"; } @Override public String toString() { // TODO Auto-generated method stub System.out.println("china实现类,部署该Bean是指定的ID为:"+beanName); return null; } //实现InitializingBean后,可以在初始化完成后 调用下面的方法 这样有代码污染 @Override public void afterPropertiesSet() throws Exception { System.out.println("正在执行InitializingBean接口的afterPropertiesSet"); } //在配置文件中配置 init-method 这种没有代码污染 推荐 public void init(){ System.out.println("init-method:正在初始化...."); } @Override public void destroy() throws Exception { System.out.println("实现DisposableBean,即将被销毁..."); } public void close(){ System.out.println("destory-method:即将被销毁....."); } public String getBeanName() { return beanName; } }
容器中bean的生命周期
1.spring可以管理singleton 作用域的bean的生命周期,spring可以精确的知道该bean何时被创建,何时初始化完成,容器何时销毁该bean.
2.对于prototype的bean.spring只负责创建,之后,完全交割客户端代码,容器不在跟踪其生命周期.
依赖关系注入之后的行为 spring提供了两种方式完成
1.使用init-mehtod
2.实现initializingBean 接口
3.如果这两个都写了, 会先执行 initialingBean 接口的方法 然后执行 init-method
Bean销毁之前的行为
1.使用 destory-method
2.实现despoableBean接口
<bean id="peopleFactory" class="cn.sh.springmvc_java.factory.PeopleFactory"/> <bean id="china" factory-bean="peopleFactory" factory-method="getPeople"> <constructor-arg value="chin"/> </bean> <bean id="american" factory-bean="peopleFactory" factory-method="getPeople" scope="prototype" init-method="init" destroy-method="close"> <constructor-arg value="ame"/> </bean>
//测试init -method 和 destory -method @Test public void test15(){ AbstractApplicationContext act=new ClassPathXmlApplicationContext("classpath*:applicationContent.xml"); People pa=act.getBean("american",People.class); pa.toString(); //未来让spring容器注册关闭钩子 act.registerShutdownHook(); System.out.println("aaa"); pa=null; System.gc(); }
发表评论
-
spring-session 中的坑
2017-07-06 15:34 9994spring-session 配置 依赖 gradle ... -
Spring AspectJ Aop Annotation
2017-03-29 17:08 708import org.aspectj.lang.Proce ... -
spring 第13天 使用@scheduled注解执行定时任务
2015-01-06 23:11 54085我们使用spring的注解 @Scheduled 执行定时任务 ... -
Spring 第12天,事务传播属性和 隔离级别
2014-09-28 00:36 8151 事务的传播属性(Propagation) 1) REQ ... -
spring 第11天 quartz任务调度
2014-08-24 13:59 1146Quartz是一个强大的企业级任务调度框架,Spring中继承 ... -
spring 第10 天 AOP 面向切面
2014-08-21 00:08 1752AOP(Aspect Orient Programming ... -
spring 第9天 Resurce 资源访问
2014-08-17 22:20 1868Spring Resource接口 spring提供的Reso ... -
spring 第8天 Spring 注解
2014-08-17 15:33 1472spring注解 @Component:标注一个普通的sp ... -
spring 第7天 Bean,BeanFactory处理器,配置器
2014-08-16 21:46 1237spring 两种后处理器 第一种,Bean 后处理器 对容器 ... -
spring 第6天SpEL,P命名空间,Util Schema
2014-08-13 22:52 1315使用p名称空间配置属性 ... -
spring 第5天不同作用域的bean,注入Field,方法返回值
2014-08-11 22:31 2113协调作用域不同步的bean 问题是;当一个singleton的 ... -
spring 第3天使用java类和XML配置bean
2014-08-09 16:51 1505下面采用java类来配置bean,前面都采用xml进行配置be ... -
spring 第2天,bean作用域,自动注入集合
2014-08-06 22:16 1932sping容器中的Bean <!---beans的全 ... -
spring 第1天 IOC,DI,国际化,容器事件
2014-08-04 21:27 13951.构造注入(就是使用 构 ... -
SpringMVC 注解 和非注解
2014-01-26 10:29 18018首先看看非注解的项目结构 在web.xml文件 配置spr ... -
详解spring 每个jar的作用
2013-11-19 23:54 3911spring.jar 是包含有完整 ... -
Spring配置Hibernate事务
2013-11-10 13:45 1216为了保证数据的一致性,在编程的时候往往需要引入事务这个概念。事 ... -
Spring 中引用Properties文件
2013-08-29 14:39 10657其中部分配置信息(邮件发送相关): #邮件发送的相关配置 ... -
Spring IOC控制反转 依赖注入DI
2012-12-15 09:37 2330目录 1.使用IOC控制反转 中的DI依赖注入 手工注入 ... -
Spring IOC控制反转 依赖注入DI
2012-12-14 16:23 8目录 1.使用IOC控制反转 中的DI依赖注入 (两种配置方式 ...
相关推荐
在本文中,我们详细讲解了Spring Bean的初始化和销毁,包括使用@Bean的initMethod和destroyMethod、JSR-250的@PostConstruct和@PreDestroy注解等多种方式来控制Bean的生命周期。在实际开发中,我们可以根据需要选择...
4. destory-method 属性 destory-method 属性用于指定在 Spring 容器关闭或销毁时调用的方法。这只适用于单例模式,用于释放资源、关闭连接等操作。 这些基于 Spring IOC Bean 的几个属性可以帮助开发者更好地控制...
namebeans.xml简单属性的注入UserDAOImpl连接池需要bean的scope属性singleton单例prototype原型官方文档,scope集合注入设置好set,get方法在bean中设置好值自动装配auto-wire生命周期lazy-initinit-method,destory-
init-method="initMethod" destory-method="destroyMethod"/> ``` 对应的Java类可以像这样定义: ```java public class DataInitializer { public void initMethod() throws Exception { System.out.println(...
9. 自定义的inti-method指定的方法:如果配置文件中使用init-method属性指定了初始化方法,那么Bean在实例化完成后将会调用该属性指定的初始化方法进行Bean的初始化。 在这个阶段,如果配置文件中指定了初始化方法...
spring配置对象实例化后执行的方法,两种实现比对,通过DisposableBean接口,并实现destory()方法;或者通过applicationContext.xml配置destory-method属性
4.BeanPostProcessor 接口 BeanPostProcessor 接口提供了一种更加灵活的方式来介入 Bean 的初始化和销毁过程。它包含两个方法: - `postProcessBeforeInitialization(Object bean, String beanName)`:在 ...
- `init-method`和`destroy-method`属性指定bean初始化和销毁时要执行的方法。例如,`personService2`在创建后会调用`init`方法,在容器关闭时调用`destory`方法。 8. **属性注入**: - `<property>`元素用于注入...
2. 通过在xml中定义init-method 和 destory-method方法。 3. 通过Bean实现InitializingBean和 DisposableBean接口。 4. 写一个类,实现BeanPostProcessor接口,这个接口有两个方法:postProcessBeforeInitialization...
DispatcherServlet 首先是一个 Servlet,Servlet 有自己的生命周期的方法(init、destory 等),那么我们在看 DispatcherServlet 初始化时首先需要看源码中 DispatcherServlet 的类结构设计。 DispatcherServlet 的...
web项目:第一个Servlet程序 Servlet的生命周期:init--service--destroy、执行流程:构造器--init方法--循环[ service方法 ]--destory方法(正常关闭Tomcat)、启动tomcat测试
Spring框架提供了自动扫描的功能,通过该功能可以自动检测并注册带有特定注解的类为Spring管理的bean,从而极大地减少了显式配置的需求。这一特性主要通过`<context:component-scan>`元素实现。 ##### 配置示例: ...
@Bean(name = "user", initMethod = "init", destroyMethod = "destory") @Scope("prototype") public User getUser() { return new User("tom", 20); } ``` 在上面的例子中,我们使用@Bean注解注册了一个名为...
10. Spring 容器关闭时调用 DisposableBean 的 destory() 方法; 二、Spring Bean 的作用域 在 Spring 的配置文件中,可以给 bean 加上 scope 属性来指定 bean 的作用域。常见的作用域有: 1. singleton:唯一 ...
- **默认 Bean 名称**:如果没有显式指定 Bean 的名称,则 Spring 默认将类名首字母小写后的字符串作为 Bean 的名称。例如,对于 `VentorServiceImpl` 类,默认 Bean 名称为 `ventorServiceImpl`。 - **自定义 Bean...
刚开始使用的方法是:关闭导航标签,直接调用对应的页面的$destory()方法,OK,可以实现关闭页面(下次再打开该页面,将初始化)的功能,但是遇到个问题: 该页面将不再被缓存,也就是说切换导航tab时,页面将不断的...
4. **继承关系**:在ORM中,继承关系可以帮助我们将通用的属性和行为抽象到父类,子类则继承并可能扩展这些特性。这有助于减少代码重复和提高代码的可维护性。 通过Hibernate,我们可以定义这些关系,如使用`@...
4. servlet 有专有的方法 init()、destory()、doGet()、doPost()。 B: 设计方案及流程: 设计一个登陆页面,用户提交后,将数据提交给 action,Servlet 来控制处理,判断用户名、密码是否正确,根据不同的结果返回...
### 4. 执行Java程序的方法 执行Java程序的正确方式是使用命令行工具`java`加上类名(不含`.class`扩展名),即选项B:“java FristApp”。这将调用Java虚拟机(JVM)来运行指定类的`main`方法。 - **选项解析**:...