理论学习
·PO(persistent object)是持久化对象,所谓的持久化就是和数据库对应的主要是字段上,典型的应用是在hibernate中通过实体对象直接操作数据库的增删查改。一般提供get、set方法,实现序列化接口,可以继承自其它的object。
·VO(value object)有时可以跟po一样,有时并不对应,因为其并不直接和数据库打交道,名字并不是强制的。
·POJO(Plain old java objects)简单java对象,不继承任何类,不实现任何接口,只有属性和get、set方法。
·Spring 的两个核心概念:
依赖注入 DI
面向切面编程 AOP
依赖注入让相互协作的软件保持松散耦合,而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件。
面向切面编程往往被定义为促使应用程序分离关注点的一项技术。系统由许多不同组件组成,每一个组件各负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理和安全此类的系统服务经常融入到自身核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为他们总是跨越系统的多个组件。
·Spring下载
Csdn下载地址:http://download.csdn.net/detail/bestcxx/9623917
下载下来的jar包:spring-framework-3.0.0.RC3-with-docs.zip
解压之后的内部结构:
·bean的配置文件的基本模板beanConfigurerTests.xml地址位于解压后的位置如下:
\..\spring-framework-3.0.0.RC3\projects\org.springframework.aspects\src\test\java\org\springframework\beans\factory\aspectj\beanConfigurerTests.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
</beans>
· Spring 的核心框架自带了10个命名空间配置,刚才的出现在beans配置文件中的beans只是其中之一,全部描述如下:
aop:为声明切面以及将 @AspectJ注解的类代理为Spring切面提供了配置元素。
beans: 支持声明Bean和装配Bean,是Spring最核心也是最原始的命名空间。
context: 为配置Spring应用上下文提供了配置元素,包括自动检测和自动装配Bean,注入非Spring直接管理的对象。
jee:提供了与JavaEE API的集成,例如JNDI和EJB。
jms: 为声明消息驱动的POJO提供了配置元素。
lang: 支持配置由Groovy、JRuby或BeanShell等脚本实现的Bean。
mvc:启用Spring MVC的能力,例如面向注解的控制器、视图控制器和拦截器。
oxm: 支持Spring的对象到XML映射配置。
tx: 提供声明式事物配置。
util: 提供各种各样的工具类元素,包括把集合配置为Bean,支持属性占位符元素。
·Spring模块
当我们下载Spring 并解压后,在dist 目录下可以看到20个不同的jar文件,它们依据所属功能可以划分为6个不同的功能模块。
·创建spring项目
1、在myeclipse中创建一个新的web项目,springtest
为了便于以后使用maven管理项目,建立如下的目录结构
2、引入spring3.0 的所有jar包,下载下来后位于目录dist下
此外,由于spring 还需要其他基础jar包的支持,而我们正好要配合使用struts2,所以还要引入下面的jar包,即struts2的基础jar包
下载地址:http://download.csdn.net/detail/bestcxx/9626401
3、将bean.xml 配置文件放置到 src.main.resources的spring文件夹下,将文件名改为
applicationContext.xml
由于目前还没有具体的bean配置,所以该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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
</beans>
4、编写接口类-表演者
接口类是实现spring 依赖注入思想的基础,spring通过配置文件或者注解完成接口调用时的不同实体的注入,从而实现了松耦合。
Performer.java 的内容
package stu.bestcxx.springtest.facade;
/**
* spring通过调用接口,而接口由不同的实现类来执行具体的实现,
* 通过spring的配置文件或者注解完成"依赖注入"(DI)
*
* @author WuJieJecket
*/
public interface Performer {
public void perform();
}
5、编写表演者接口的实现类-具备具体表演技能
PerformJuggler.java
package stu.bestcxx.spring.impl;
import stu.bestcxx.springtest.facade.Performer;
/**
* 实现接口类 Perform
* 杂技师 juggler
* 其表演内容是抛豆子
* 为了体现传参功能,其可以抛固定个数的豆子
* 也可以通过构造方法完成注入 豆子的数量
*
* @author WuJieJecket
*/
public class PerformJuggler implements Performer {
//豆子的数量
private int beanBags=3;
//由于重构了无参构造方法,需要显示声明默认构造方法
public PerformJuggler(){};
//重构构造方法,增加入参
public PerformJuggler(int beanBags){
this.beanBags=beanBags;
};
@Override
public void perform() {
// TODO Auto-generated method stub
System.out.println("杂技师表演抛豆袋子,数量是 "+beanBags);
}
}
6、在配置文件applicationContext.xml中
杂技师 juggler ,杂技师并不是一个具体的人,而是一个职业,这样Performer对应多个职业,一个职业对应多个人。至于这个人是谁?就是spring要做的事情了,将这个人注入到杂技师这个bean中
<!-- 杂技师-juggler1 -->
<bean id="juggler1" class="stu.bestcxx.spring.impl.PerformJuggler"/>
7、编写测试方法,让杂技师juggler1进行表演
根据maven规范(尽管这个项目没有使用maven),应该建立完善的测试方法
PerformJugglerTest.java内容如下:
package stu.bestcxx.spring.impl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import stu.bestcxx.springtest.facade.Performer;
public class PerformJugglerTest {
/*
* 杂技师 juggler1表演抛豆子
*/
@Test
public void testperform(){
//从类路径获取spring的上下文
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring/applicationContext.xml");
//根据配置文件,将杂技师 juggler1 注入到表演者 Performer
Performer juggler1=(Performer) ctx.getBean("juggler1");
//juggler1进行表演
juggler1.perform();
}
}
运行结果:
8、从文件系统获取spring的上下文
刚才的测试方法是从类路径中获取的beans的配置信息,下面演示从文件系统获取spring的上下文。在myeclipse的Navigator视图模式下,我们看到,applicationContext.xml已经被编译到classes目录下
在PerformJugglerTest.java中添加内容
/*
* 杂技师 juggler1表演抛豆子
* 文件系统获取spring的上下文
*/
@Test
public void testperform2(){
//从文件系统获取spring的上下文,可以使用通配符表示多个文件,如aaaT.xml 和 bbT.xml 可以是*T.xml
//ApplicationContext ctx=new FileSystemXmlApplicationContext("WebRoot/WEB-INF/classes/spring/applicationContext.xml");
ApplicationContext ctx=new FileSystemXmlApplicationContext("classpath:spring/applicationContext.xml");
//根据配置文件,将杂技师 juggler1 注入到表演者 Performer
Performer juggler1=(Performer) ctx.getBean("juggler1");
//juggler1进行表演
juggler1.perform();
}
9、使用XmlWebApplicationContext获取spring系统的上下文
在这种模式下,web 项目启动之后就会自动加载beans 的配置文件
我们在方法中使用的时候可以直接使用spring的依赖注入功能。
9.1优先是修改web.xml的内容,修改完后如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔 此参数用于后面的Spring Context Loader -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<!-- struts2 的filter 配置 -->
<filter>
<filter-name>springfilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>springfilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<listener>
<description>Spring 刷新 Introspector 防止内存泄露</description>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<listener>
<description>Spring ApplicationContext 载入</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
9.2 然后编写action类
Juggler1Action.java 内容如下
package stu.bestcxx.springtest.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import stu.bestcxx.springtest.facade.Performer;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Juggler1Action extends ActionSupport {
private static final long serialVersionUID = 7483844875659263452L;
/**
* 继承了struts2的 ActionSupport 类,直接重写 execute方法
*/
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
//使用 XmlWebApplicationContext 获取 Spring 的上下文
ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
ServletContext servletContext = request.getSession().getServletContext();
ApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext);
//根据配置文件,将杂技师 juggler1 注入到表演者 Performer
Performer juggler1=(Performer) wac.getBean("juggler1");
//juggler1进行表演
juggler1.perform();
return SUCCESS;
}
}
9.3新增struts.xml文件
struts.xml 内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<include file="struts/struts-juggler1.xml"></include>
</struts>
struts-juggler1.xml的内容
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="juggler1" extends="struts-default" namespace="/juggler1">
<action name="juggler1" class="stu.bestcxx.springtest.action.Juggler1Action">
<result name="success" type="redirect">https://www.baidu.com</result>
</action>
</package>
</struts>
9.4 启动服务,访问如下地址,注意端口,我的测试环境是8085
http://localhost:8085/springtest/juggler1/juggler1.action
页面会跳转到百度首页,这不是重点,控制台打印输出
基础环境搭建和测试访问结束