Spring编程---(一)

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编程---(一)_第1张图片
 

不设置的话如下:

如此看结果就能明白了吧。

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
				
				
					
				
			
		
	
	
	
		
	

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(框架)