【转】Spring 学习笔记--强烈推荐
**
* 阅前说明:
* 此文件为笔者在学习Spring时所写的一些笔记<br>
* 希望能抛砖引玉来促进大家以各种方式交流学习心得<br>
* 如有转载,为了尊重笔者的劳动成果,请保留此段说明<br>
* @author 贺小佼 HeXiaojiao<br>
* Email ld_hxj1@yahoo.com.cn <br>
* QQ 88137099<br>
* Time 2008-04-14 16:43:43 <br>
* Blog http://blog.csdn.net/hexiaojiao
*/
Day-01
问题提出:
框架的主要优势是什么?
请简要描述Spring?
Spring框架分为哪几个模块,请详述?
Spring有哪些注入方式,请详细描述?
1.在Setter注入方式中,在beans包下的ProductBean中只加入一个带参数的构造
方法会如何?
2.在config.xml中少加一property项会如何?
3.Spring中有哪些集合注入,如何注入?
4.问:如何设置单例模式?有什么作用和特殊效果?
5.问:什么叫混合注入模式,请举例说明?
6.问: Spring中如何进行类型数据的设置
7.问:Spring支不支持数据类型自动转换?构造器复杂情况有哪些?
8.问:如果为嵌套属性(其属性为一个类)时如果配置?(Bean的引用如果配置)
9.问:Bean初始化方案有哪几种,请详述?
10.问:在bean类中(1)初始化接口方案、(2)构造方法与(3)初始化方法方案中各
方法的执行顺序如何?
//=======================================================
问题解决:
//-------------------------------
----------
框架的主要优势是什么?
请简要描述Spring?
Spring框架分为哪几个模块,请详述?
答:Spring框架可分为七个模块,分别如下:
1.核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组
件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)
模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
2.Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供
上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际
化、校验和调度功能。
3.Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的
编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的
任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供
了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性
事务管理集成到应用程序中。
4.Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该
结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了
错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)
。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
5.Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM
的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都
遵从 Spring 的通用事务和 DAO 异常层次结构。
6.Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,
为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta
Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对
象的工作。
7.Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC
实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术
,其中包括 JSP、Velocity、Tiles、iText 和 POI。
//-------------------------------
----------
Spring有哪些注入方式,请详细描述?
答: 通过注入方式,使程序解耦合
一。通过构造器(构造方法)注入
构造器注入操作步骤:
1.引入Spring架包,建包ioc.common 在这包下建立三个包
ioc.common.beans,ioc.common.config,ioc.common.logic
2.在beans包下建立UserBean类,代码如下:
//UserBean.java package ioc.common.beans;public class UserBean { private String userName; private String userPassword; public UserBean() { } public UserBean(String userName, String userPassword) { this.userName = userName; this.userPassword = userPassword; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } @Override public String toString() { return userName + "-" + userPassword; }} <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <bean id="userBean" name="code"> package ioc.common.logic;import ioc.common.beans.UserBean;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class Run { public static void main(String[] args) { String fileName = "./src/ioc/common/config/config.xml"; ApplicationContext ac = new FileSystemXmlApplicationContext(fileName); // 取得一个实例 UserBean user = (UserBean) ac.getBean("userBean"); System.out.println(user); }}//end of Run.javaException in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBean' defined in file [/home/tarena/corejava/JSP/SpringPrj/./src/ioc/common/config/config.xml]: 2 constructor arguments specified but no matching constructor found in bean 'userBean' (hint: specify index and/or type arguments for simple parameters to avoid type ambiguities)
//ProductBean.javapackage ioc.common.beans;public class ProductBean { private String productName; private String productDiscript; public void setProductName(String productName) { this.productName = productName; } public void setProductDiscript(String productDiscript) { this.productDiscript = productDiscript; } @Override public String toString() { return productName + "-" + productDiscript; }} <bean id="productBean" name="code"> //RunSetter.javapackage ioc.common.logic;import ioc.common.beans.ProductBean;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class RunSetter { public static void main(String[] args) { String fileName = "./src/ioc/common/config/config.xml"; ApplicationContext ac = new FileSystemXmlApplicationContext(fileName); ProductBean product = (ProductBean) ac.getBean("productBean"); System.out.println(product); }}<list> <value>Eric</value> <value>Narci</value> </list> <map> <entry key="HR"> <value>人力资源部</value> </entry> <entry key="MIS"> <value>信息管理部</value> </entry> </map> <props> <prop key="GG">成俊杰</prop> <prop key="MM">伍欣</prop> </props> <set> <value>CoreJava</value> <value>JDBC</value> <value>AJAX</value> </set>
<property name="product"> <ref bean="product"/><!--bean名为此配置文件中的另一个(引用类的)bean中id属性值--> </property> <property name="brithday"> <ref bean="date"/> </property> <bean id="date" name="code"> //Bean开发: package init.beans; public class User implements InitializingBean { private String userName; public void afterPropertiesSet () throws Exception { this.userName = "Google"; System.out.println("++++++++++++1"); } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } } <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <bean id="userBean" name="code"> package init.logic;import init.beans.UserBean;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class RunLogic { public static void main(String[] args) { String fileName = "./src/init/config/config.xml"; ApplicationContext ac = new FileSystemXmlApplicationContext(fileName); String beanName = "userBean"; Object obj = ac.getBean(beanName); if (obj != null) { UserBean user = (UserBean) obj; System.out.println(user.getUserName()); } }} //init.beans.UserBean public String initUser() { this.userName = "BaiDu"; System.out.println("*******************2"); return this.userName; } <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <bean id="userBean" name="code"> //init.logic.RunLogicpackage init.logic;import init.beans.UserBean;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class RunLogic { public static void main(String[] args) { String fileName = "./src/init/config/config.xml"; ApplicationContext ac = new FileSystemXmlApplicationContext(fileName); String beanName = "userBean"; Object obj = ac.getBean(beanName); if (obj != null) { UserBean user = (UserBean) obj; System.out.println(user.getUserName()); } }} public UserBean() { System.out.println("#######################0"); } public String initUser() { this.userName = "BaiDu"; System.out.println("*******************2"); return this.userName; } public void afterPropertiesSet() throws Exception { this.userName = "Google"; System.out.println("++++++++++++1"); }<property name="basenames"> <list> <value>international.config.resources</value> <!-- 可写多个资源文件 --> </list> </property>
//event.events.WarnEventpackage event.events;import org.springframework.context.ApplicationEvent;public class WarnEvent extends ApplicationEvent { private static final long serialVersionUID = 3287507907413175457L; public WarnEvent(Object source) { super(source); }} //event.listeners.Receiver package event.listeners;import org.springframework.context.ApplicationEvent;import org.springframework.context.ApplicationListener;import event.events.WarnEvent;public class Receiver implements ApplicationListener { public void onApplicationEvent(ApplicationEvent event) { System.out.println("Receiver接收到事件@"); if (true == event instanceof WarnEvent) { // 对各种事件的处理 WarnEvent we = (WarnEvent) event; String msg = (String) we.getSource(); System.out.println("Receiver" + msg); } }} //event.listeners.JaneReceiverpackage event.listeners;import org.springframework.context.ApplicationEvent;import org.springframework.context.ApplicationListener;import event.events.WarnEvent;public class JaneReceiver implements ApplicationListener { public void onApplicationEvent(ApplicationEvent event) { System.out.println("JaneReceiver接收到事件@"); if (true == event instanceof WarnEvent) { // 对各种事件的处理 WarnEvent we = (WarnEvent) event; long time = we.getTimestamp(); System.out.println("time" + time); String msg = (String) we.getSource(); System.out.println("JaneReceiver" + msg); } }} <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <bean id="receiver" name="code"> package event.sender;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import event.events.WarnEvent;public class Run { public static void main(String[] args) { String sourceFile = "src/event/config/config.xml"; ApplicationContext act = new FileSystemXmlApplicationContext(sourceFile); WarnEvent event = new WarnEvent("HaHa"); act.publishEvent(event); }}