- 浏览: 148285 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
flyingcatjj:
很适合我这种刚接触的
myeclipse xfire 开发webservice实例 -
tangzlboy:
非常好,非常详细,非常中用。
linux入门 -
yzz9i:
楼主说的很是详细。
myeclipse xfire 开发webservice实例 -
zqx888191:
很再理阿!
老程序员的教诲 -
simplecat123:
...
SQLite数据读取
十七 Spring2.5+JPA+Struts1.3整合开发 第一步 加入spring的jar包 Spring安装包下的 dist\spring.jar dist\modules\spring-webmvc-struts.jar lib\jakarta-commons\commons-logging.jar、commons-dbcp.jar、commons-pool.jar lib\aspectj\aspectjweaver.jar、aspectjrt.jar lib\cglib\cglib-nodep-2.1_3.jar lib\j2ee\common-annotations.jar lib\log4j\log4j-1.2.15.jar 加入jpa的hibernate的实现包 这里JPA的实现采用hibernate,需要使用到下面的jar文件 Hiberante核心包(8个文件) hibernate-distribution-3.3.1.GA --------------------------------------------- hibernate3.jar lib\bytecode\cglib\hibernate-cglib-repack-2.1_3.jar lib\required\*.jar Hiberante注解包(3个文件):hibernate-annotations-3.4.0.GA ------------------------------------------------------------------------------------ hibernate-annotations.jar lib\ejb3-persistence.jar、hibernate-commons-annotations.jar Hibernate针对JPA的实现包(3个文件):hibernate-entitymanager-3.4.0.GA ------------------------------------------------------------------------------------------------------ hibernate-entitymanager.jar lib\test\log4j.jar、slf4j-log4j12.jar 第二步 加入spring的配置文件 beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- 启动注解依赖注入 --> <context:annotation-config/> <!-- 作用:跟hibernate的sessionFactory的作用是一样的,是一个连接工厂的对象,使用的是spring的jap的连接工厂 --> <!-- persistenceUnitName 持久化单元名称 这个是要在src的META-INF配置 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="itcast"/> </bean> <!-- 配置jpa的事务管理容器 --> <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!-- 开启注解方式启动事务管理 --> <tx:annotation-driven transaction-manager="txManager"/> </beans> 第三步:在src的META-INF配置 META-INF目录下放置persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <!--persistence-unit 这里就是持久化单元的配置 单元的名称是 itcast --> <persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="root"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8"/> <property name="hibernate.max_fetch_depth" value="3"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence> 第四步 建立实体bean package cn.itcast.bean; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; /** * 利用注解 表明当前的Person是一个实体bean * @author Administrator * */ @Entity public class Person implements Serializable { private Integer id; private String name; public Person(){} public Person(String name){ this.name=name; } /** * Id 实体标识 * GeneratedValue 指定主键生成策略 * @return */ @Id @GeneratedValue public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } /** * Column 指定获取name的映射的列名 并指定列值长度 并指定其列值是否允许为空 * @return */ @Column(length=10,nullable=false) public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } } 第五步 建立服务bean PersonServiceBean package cn.itcast.service.impl; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import cn.itcast.bean.Person; import cn.itcast.service.PersonService; /** * @Transactional 这个注解用来为这个服务开启事务 * @author Administrator * */ @Transactional public class PersonServiceBean implements PersonService { /** * @PersistenceContext 用来注入EntityManager对象 * 原理:要这个注入 到这个service spring会从spring的配置文件中的entityManagerFactory * 得到EntityManager对象 */ @PersistenceContext EntityManager em; public void save(Person person){ em.persist(person); } public void update(Person person){ em.merge(person); } public void delete(Integer id){ em.remove(em.getReference(Person.class, id)); } /** * 指定当前的方法不需要开启事务 并且设定为只读 */ @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) public Person getPerson(Integer personid){ return em.find(Person.class, personid); } @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) @SuppressWarnings("unchecked") public List<Person> getPersons(){ //这里的查询语句的from 后 必须是实体类名 return em.createQuery("select o from Person o").getResultList(); } } 第六步 建立相应的接口 package cn.itcast.service; import java.util.List; import cn.itcast.bean.Person; public interface PersonService { public void save(Person person); public void update(Person person); public void delete(Integer id); public Person getPerson(Integer personid); @SuppressWarnings("unchecked") public List<Person> getPersons(); } 做测试类 package junit.test; import static org.junit.Assert.*; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.itcast.bean.Person; import cn.itcast.service.PersonService; public class PersonServiceBeanTest { private static PersonService personservice; @BeforeClass public static void setUpBeforeClass() throws Exception { try { AbstractApplicationContext context=new ClassPathXmlApplicationContext("beans.xml"); personservice=(PersonService)context.getBean("personService"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void testSave() { personservice.save(new Person("小叶")); } @Test public void testUpdate() { fail("Not yet implemented"); } @Test public void testDelete() { fail("Not yet implemented"); } @Test public void testGetPerson() { fail("Not yet implemented"); } @Test public void testGetPersons() { fail("Not yet implemented"); } } 到这里spring+jpa的集成方式就已经完成了 现在我们来集成struts 第七步:集成struts 加入struts的jar包到lib目录下 除struts中的antlr-2.7.2.jar这个包不能加入外 因为这个包在spring中已经加入了 为避免冲突,不需要加入进来 第八步 添加spring到web容器中,让web容器去实例化这个spring 同时指定实例化的spring添加到action范围中,以后我们的web应用就可以去得到spring容器 <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <!-- 对Spring容器进行实例化 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 在web容器中配置struts, <servlet> <servlet-name>struts</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>struts</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> 在struts配置文件中添加进spring的请求控制器,该请法语控制器会先根据action的path属性值到spring容器中寻找跟该属性值同名的bean。如果寻找到即使用该bean处理用户请求 <controller> <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/> </controller> 第九步 现在我们来做一个action 测试一下 package cn.itcast.action; import javax.annotation.Resource; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import cn.itcast.service.PersonService; public class PersonAction extends Action { @Resource PersonService personService; @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("persons", personService.getPersons()); return mapping.findForward("list"); } } 并把这个action中交给spring管理 同时也配置到struts-config.xml <bean name="/person/list" class="cn.itcast.action.PersonAction"/> 现在把这个配置到struts-config.xml <action-mappings> <action path="/person/list" validate="false"> <forward name="list" path="/WEB-INF/page/personlist.jsp"></forward> </action> </action-mappings> 在浏览器中输入 http://localhost:8808/SSJ/person/list.do 现在我们来利用web页面 插入数据会有乱码问题 解决方法 配置spring的过滤器,解决乱码 <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 好了 jpa是用EntityManager类进行数据的操作的,如果这个EntityManager对象关闭 会出现延迟加载例外 怎么解决呢? 使用spring解决JPA因EntityManager关闭导致的延迟加载例外问题。 <filter> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 怎么解决struts1的单例模式 因为struts1是线程不安全的,所以要解决这个问题 当struts1的action交给spring管理后,就可以解决这个问题 只需要在spring 管理的action配置中指定其请求范围即可 <bean name="/person/pmessage" class="cn.itcast.action.PersonMessageAction" scope="prototype"></bean> 这个scope指定的范围:request prototype session singleton 四种模式 现在到这里Spring2.5+JPA+Struts1.3整合就已经全部完成了 现在我们来看其配置文件 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <!-- 对Spring容器进行实例化 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 从web页面中插入到数据库中会有乱码的出现 所以利用 spring提供的过滤器 可以解决乱码问题--> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- jpa是用EntityManager进行数据操作的,如果这个对象关闭,将会出现延迟加载例外 解决方法 --> <filter> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 把struts添加到web容器中 --> <servlet> <servlet-name>struts</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>struts</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> jpa的配置文件 persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <!--persistence-unit 这里就是持久化单元的配置 单元的名称是 itcast --> <persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="root"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"/> <property name="hibernate.max_fetch_depth" value="3"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence> spring的配置文件 beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- 启动注解依赖注入 --> <context:annotation-config/> <!-- 作用:跟hibernate的sessionFactory的作用是一样的,是一个连接工厂的对象,使用的是spring的jap的连接工厂 --> <!-- persistenceUnitName 持久化单元名称 这个是要在src的META-INF配置 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="itcast"/> </bean> <!-- 配置jpa的事务管理容器 --> <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!-- 开启注解方式启动事务管理 --> <tx:annotation-driven transaction-manager="txManager"/> <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"/> <bean name="/person/list" class="cn.itcast.action.PersonAction"/> <bean name="/person/pmessage" class="cn.itcast.action.PersonMessageAction" scope="prototype"></bean> </beans> struts1的配置文件 <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <form-beans> <form-bean name="PersonForm" type="cn.itcast.formbean.PersonForm"/> </form-beans> <global-forwards> <forward name="message" path="/WEB-INF/page/message.jsp"></forward> </global-forwards> <action-mappings> <action path="/person/list" validate="false"> <forward name="list" path="/WEB-INF/page/personlist.jsp"></forward> </action> <action path="/person/pmessage" validate="false" parameter="method" scope="request" name="PersonForm"></action> </action-mappings> <!-- 在struts配置文件中添加进spring的请求控制器,该请法语控制器会先根据action的path--> <!-- 属性值到spring容器中寻找跟该属性值同名的bean。如果寻找到即使用该bean处理用户请求 --> <controller> <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/> </controller> </struts-config> end 完毕!
发表评论
-
十八 Spring2.5+Hibernate3.3+Struts2整合开发
2011-07-04 17:16 825十八 Spring2.5+Hibernate3.3+Strut ... -
十六 Spring2.5+Hibernate3.3+Struts1.3整合开发
2011-07-04 17:13 914十六 Spring2.5+Hibernate3.3+Strut ... -
十五 用xml方式配置事务
2011-07-04 17:11 844十五 用xml方式配置事务 ... -
十四 spring容器的声明式事务管理
2011-07-04 17:10 984spring在运行期(unchecked ... -
十三 Spring+JDBC组合开发
2011-07-04 17:09 971十三 Spring+JDBC组合开发 ... -
十二 spring的AOP编程
2011-07-04 17:06 1388Aspect(切面):指横切性关 ... -
十一 使用CGLIB实现AOP功能与AOP概念解释
2011-07-04 17:05 827十一 使用CGLIB实现AOP功能与AOP概念解释 前面 ... -
十 使用JDK中的Proxy技术实现AOP功能
2011-07-04 17:03 817十 使用JDK中的Proxy技术实现AOP功能 通过代理 ... -
九 自动扫描和管理bean
2011-07-04 17:02 767九 自动扫描和管理bean ... -
八 @Autowire注解与自动装配
2011-07-04 17:01 878使用了@Autowired的注解方式,这种默认按类型查找符合的 ... -
七 编码剖析@Resource注解的实现原理
2011-07-04 17:00 1104七 编码剖析@Resource注解的实现原理 Itcas ... -
六 用@Resource注解完成属性装配
2011-07-04 16:58 1848六 用@Resource注解完成属性装配 java代 ... -
五 依赖注入
2011-07-04 16:57 760五 依赖注入 1>set注入方式 1 对象注入 ... -
四 spring管理bean的作用域
2011-07-04 16:57 953四 spring管理bean的作用域 先看配置 < ... -
三 实例化bean的方法
2011-07-04 16:56 721三 实例化bean的方法 1接口 package cn. ... -
二 开启spring之旅
2011-07-04 16:55 7201 首先下载spring 最佳答案 版本2.5.6,官 ... -
一 spring的介绍
2011-07-04 16:54 7011 Spring是什么 Spring是一个开源的控制反转(I ... -
Spring学习笔记(4)----Bean节点信息配置
2010-10-29 16:53 793默认情况下,Spring的Ioc容器启动时会初始化bean ... -
Spring学习笔记(3)----编码剖析Spring管理Bean的原理
2010-10-29 16:47 728Xml代码 <?xml versio ... -
Sping学习笔记(2)----实例化Bean的三种方式
2010-10-29 16:45 842Spring的实例化Bean有三种方式: 使用类构造器 ...
相关推荐
以上就是Spring 2.5、Hibernate 3.3和Struts 1.3整合过程中涉及的关键知识点和步骤。整合这三大框架可以构建出一个强大的Java Web应用,充分利用它们各自的优势,提高开发效率和代码质量。不过,随着技术的发展,...
Struts1.3、Spring2.5和JPA(基于Hibernate)是Java Web开发中三个重要的框架,它们的集成使用可以构建出强大的企业级应用。这个"Struts1.3+spring2.5+JPA(hibernate) demo"提供了一个实践性的学习案例,帮助初学者...
Struts1.3、Spring2.5和Hibernate3.3是经典的Java企业级开发框架组合,通常被称为SSH(Struts + Spring + Hibernate)框架。这个组合在过去的许多项目中被广泛应用,提供了强大的功能来构建MVC(Model-View-...
SSH整合包(S1.3+S2.5+H3.3)是一个常见的Java Web开发框架组合,由Struts 1.3、Spring 2.5和Hibernate 3.3这三大开源框架集成而成。这个整合包是开发人员进行企业级应用开发时常用的一种工具集合,便于快速构建基于...
本教程将详细介绍如何手动搭建Spring 2.5、Struts 1.3和Hibernate 3.5的集成环境。 **1. Spring 2.5** Spring是一个全面的企业级应用框架,它提供了AOP(面向切面编程)、DI(依赖注入)以及事务管理等功能。在...
标题 "dwr2.0整合Struts1.3+hibernate3.1+spring2.5的项目" 涉及的是一个经典的Java Web开发技术集成,这其中包括Direct Web Remoting (DWR) 2.0、Struts 1.3、Hibernate 3.1和Spring 2.5。这个项目可能是为了展示...
2. 集成Spring2.5环境步骤: Spring框架的核心功能是依赖注入(DI)和面向切面编程(AOP)。首先,引入Spring的相关依赖。接着,创建Spring配置文件,如`applicationContext.xml`,在此文件中声明Bean定义、数据源...
Spring 可以与 Struts 框架进行整合,通过 Spring 管理 Struts 中的 Action 对象,实现更细粒度的控制和更灵活的配置。 **3.2 与 Web Services 的整合** Spring 提供了对 SOAP 和 RESTful Web Services 的支持。...
12.6.1. 在Spring环境中建立JPA 12.6.1.1. LocalEntityManagerFactoryBean 12.6.1.2. LocalContainerEntityManagerFactoryBean 12.6.1.3. 处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于...
- **集成支持**:Spring 对主流的应用框架提供了很好的集成支持,比如 Hibernate、JPA、Struts 等,这使得开发基于这些框架的应用变得更加容易。 ##### 1.3 轻量级与重量级概念的划分 - **轻量级**:通常指的是...
以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、Spring等主流框架的各种Java应用程序。...
2.5 使用Spring表达式语言 64 2.5.1 问题 64 2.5.2 解决方案 64 2.5.3 工作原理 65 2.6 设置Bean作用域 69 2.6.1 问题 69 2.6.2 解决方案 69 2.6.3 工作原理 70 2.7 自定义Bean初始化和析构 72 ...
2.5 使用Spring表达式语言 64 2.5.1 问题 64 2.5.2 解决方案 64 2.5.3 工作原理 65 2.6 设置Bean作用域 69 2.6.1 问题 69 2.6.2 解决方案 69 2.6.3 工作原理 70 2.7 自定义Bean初始化和析构 72 ...