1、核心容器(Core)
这是Spring框架最基础的部分,它提供了依赖注入(Dependency Injection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IoC将应用配置和依赖说明从实际的应用代码中分离出来。
2、AOP模块
AOP即面向切面编程技术,Spring在它的AOP模块中提供了对面向切面编程的丰富支持。AOP允许通过分离应用的业务逻辑与系统级服务(例如安全和事务管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。
3、对象/关系映射集成模块ORM
Hibernate是成熟的ORM产品,Spring并没有自己实现ORM框架而是集成了几个流行的ORM产品如Hibernate、JDO和iBATIS等。可以利用Spring对这些模块提供事务支持等。
4、JDBC抽象和DAO模块
Spring虽然集成了几个ORM产品,但也可以不选择这几款产品,因为Spring提供了JDBC和DAO模块。该模块对现有的JDBC技术进行了优化。你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。
5、Spring的Web模块
Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。
6、应用上下文(Context)模块
核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。该模块还提供了一些面向服务支持这个模块扩展了BeanFactory的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持。
另外,这个模块还提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括对模版框架例如Velocity和FreeMarker集成的支持。
7、Spring的MVC框架
Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts2,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。
入门示例:
Person.java
package cn.hncu.spring2;
public class Person {
public Person(){
System.out.println("Person的构造方法...");
}
}
配置文件applicationContext.xml
注:spring的两个特色中的一个就是使用了xml文件,之前在网上有人说4.0版本里面没有使用到了xml配置文件了,那是错误的,使用xml 配置文件是spring的一个特色
Demo.java
package cn.hncu.spring2;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Demo {
public static void main(String[] args) {
Resource r=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(r);
Person p=(Person) factory.getBean("p");
System.out.println("p: "+p);
Person p2=(Person) factory.getBean("p");
System.out.println("p2: "+p2);
new MyThread(factory).start();
}
}
class MyThread extends Thread{
private BeanFactory factory;
public MyThread(BeanFactory factory) {
this.factory = factory;
}
@Override
public void run() {
Person p3=(Person) factory.getBean("p");
System.out.println("p3: "+p3);
}
}
像上面配置文件中的scope="prototype"这样子设置的结果如下:
不设置的话如下:
如此看结果就能明白了吧。
spring实际上就是造一个容器,然后从容器中去取东西,不设置的话造同一个对象自然拿到的是相同的。
下面稍微模拟一下mvc模式service层和dao层的传值吧
但是要注意:Spring给bean注入值时的前提是,bean中的变量一定要写set、get方法
Person.java
package cn.hncu.spring3;
public class Person {
private String name;
private Integer age;
public Person(){
// System.out.println("Person的构造方法...");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
Demo.java
package cn.hncu.spring3;
import java.awt.event.ActionListener;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import cn.hncu.spring3.login.LoginAction;
public class Demo {
//XmlBeanFactory这个bean工厂类在Spring3.0中已经过时,不建议使用
@Test
public void demo1() {
Resource r=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(r);
Person p=(Person) factory.getBean("p");
System.out.println("p: "+p);
//Spring3.0带泛型,可以不用强转
Person p2=factory.getBean(Person.class);
System.out.println("p2: "+p2);
}
@Test//Spring3.0建议采用下面这种方式使用容器
public void demo2() {
ApplicationContext factory=new ClassPathXmlApplicationContext("applicationContext.xml");
Person p=(Person) factory.getBean("p");
System.out.println("p: "+p);
//Spring3.0带泛型,可以不用强转
Person p2=factory.getBean(Person.class);
System.out.println("p2: "+p2);
}
//演示依赖(xml)注入
@Test
public void demo3(){
ApplicationContext factory=new ClassPathXmlApplicationContext("applicationContext.xml");
LoginAction login=(LoginAction) factory.getBean("login");
login.execute();
}
}
LoginAction.java
package cn.hncu.spring3.login;
import cn.hncu.spring3.Person;
import cn.hncu.spring3.login.service.ILoginService;
public class LoginAction {
private ILoginService service;
private Person p;
public ILoginService getService() {
return service;
}
public void setService(ILoginService service) {
this.service = service;
}
public Person getP() {
return p;
}
public void setP(Person p) {
this.p = p;
}
public void execute(){
service.login(p);
}
}
service层
接口
package cn.hncu.spring3.login.service;
import cn.hncu.spring3.Person;
public interface ILoginService {
public void login(Person p);
}
实现类
package cn.hncu.spring3.login.service;
import cn.hncu.spring3.Person;
import cn.hncu.spring3.login.dao.ILoginDAO;
public class LoginServiceImpl implements ILoginService {
private ILoginDAO dao;
public ILoginDAO getDao() {
return dao;
}
public void setDao(ILoginDAO dao) {
this.dao = dao;
}
@Override
public void login(Person p) {
dao.login(p);
}
}
dao层
接口
package cn.hncu.spring3.login.dao;
import cn.hncu.spring3.Person;
public interface ILoginDAO {
public void login(Person p);
}
实现类
package cn.hncu.spring3.login.dao;
import cn.hncu.spring3.Person;
public class LoginDAOJdbc implements ILoginDAO {
@Override
public void login(Person p) {
System.out.println("dao,到数据库中读取用户信息以进行登录....");
System.out.println("dao中获取的用户输入信息:"+p);
}
}
配置文件applicationContext.xml
再举一个例子演示给bean中不同的数据类型属性用配置文件设置值:
User.java
package cn.hncu.spring3.demo;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class User {
private String name;
private Integer age;
private List pets;
private Map map;
private Set set;
private Object objs[];
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List getPets() {
return pets;
}
public void setPets(List pets) {
this.pets = pets;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
public Object[] getObjs() {
return objs;
}
public void setObjs(Object[] objs) {
this.objs = objs;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", pets=" + pets
+ ", map=" + map + ", set=" + set + ", objs="
+ Arrays.toString(objs) + "]";
}
}
Cat.java
package cn.hncu.spring3.demo;
public class Cat {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Cat [name=" + name + "]";
}
}
Demo2.java
package cn.hncu.spring3.demo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo2 {
//演示spring中属性注入的一些细节
@Test
public void demo(){
ApplicationContext factory=new ClassPathXmlApplicationContext("app2.xml");
User user=factory.getBean("user", User.class);
System.out.println(user);
}
}
配置文件
dog
cat
lion
111
222
333
hello
dragon
phoenix