Spring编程---

Posted 夏小弥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

<span style="font-size:14px;">package cn.hncu.spring2;

public class Person 
	public Person()
		System.out.println("Person的构造方法...");
	
</span>

 

 

配置文件applicationContext.xml

注:spring的两个特色中的一个就是使用了xml文件,之前在网上有人说4.0版本里面没有使用到了xml配置文件了,那是错误的,使用xml 配置文件是spring的一个特色

 

<span style="font-size:14px;"><?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: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/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<!-- Person p = new Person() -->
	<!-- 默认是单例的,可以配置成原型模式 
	<bean id="p" class="cn.hncu.spring2.Person">
	</bean>
	-->
	
	<!--scope属性值设为:prototype(每次获取都是一个新对象), request(同一个request中获取到的是同一个), session  -->
	<bean id="p" class="cn.hncu.spring2.Person" scope="prototype">
	</bean>
	
</beans></span>


Demo.java

 

 

<span style="font-size:14px;">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);
	
	
</span>


像上面配置文件中的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

 

<?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:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	
	<!-- 可以在配置文件中为对象注入属性值  -->
	<bean id="p" class="cn.hncu.spring3.Person">
		<property name="name" value="Jack"></property>
		<property name="age" value="20"></property>
	</bean>
	
	<bean id="dao" class="cn.hncu.spring3.login.dao.LoginDAOJdbc"></bean>
	
	<bean id="service" class="cn.hncu.spring3.login.service.LoginServiceImpl">
		<property name="dao" ref="dao"></property>
	</bean>
	
	<bean id="login" class="cn.hncu.spring3.login.LoginAction">
		<property name="service" ref="service"></property>
		<property name="p" ref="p"></property>
	</bean>
	
</beans>


再举一个例子演示给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<String> pets;
	private Map<String, Object> map;
	private Set<String> 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<String> getPets() 
		return pets;
	
	public void setPets(List<String> pets) 
		this.pets = pets;
	
	public Map<String, Object> getMap() 
		return map;
	
	public void setMap(Map<String, Object> map) 
		this.map = map;
	
	public Set<String> getSet() 
		return set;
	
	public void setSet(Set<String> 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中<bean>属性注入的一些细节
	@Test
	public void demo()
		ApplicationContext factory=new ClassPathXmlApplicationContext("app2.xml");
		User user=factory.getBean("user", User.class);
		System.out.println(user);
	


配置文件

 

 

<?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:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	<bean id="user" class="cn.hncu.spring3.demo.User">
		<property name="name" value="Jack"></property>
		
		<property name="age" value="21"></property>
		
		<property name="pets">
			<list>
				<value>dog</value>
				<value>cat</value>
				<value>lion</value>
			</list>
		</property>
		
		<property name="map">
			<map>
				<entry key="name" value="China"></entry>
				<entry key="age" value="5000"></entry>
			</map>
		</property>
		
		<property name="set">
			<set>
				<value>111</value>
				<value>222</value>
				<value>333</value>
			</set>
		</property>
		
		<property name="objs">
			<array>
				<value>hello</value>
				<ref bean="tom"/>
				<list>
					<value>dragon</value>
					<value>phoenix</value>
				</list>
				<bean class="cn.hncu.spring3.demo.Cat">
					<property name="name" value="Jack Cat"></property>
				</bean>
			</array>
		</property>
	</bean>
	
	<bean id="tom" class="cn.hncu.spring3.demo.Cat">
		<property name="name" value="Tom Cat"></property>
	</bean>
</beans>

 

 

 

 

 

 

 

 

 

以上是关于Spring编程---的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 Bean 添加到 Spring Web App 上下文

[Spring实战系列]Spring应用上下文

第1章 spring介绍

如何在 Spring 中以编程方式解析属性占位符

以编程方式注册@Component注释类

spring简介配置入门