码迷,mamicode.com
首页 > 编程语言 > 详细

(2)Spring框架

时间:2016-07-21 19:59:49      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:spring


1、回顾



1.1、Struts2和Hibernate能够做什么?


Struts,是MVC框架中控制层的解决方案,可以进行请求数据自动封装、类型转换、文件上传、效验…

Hibernate, 是持久层的解决方案;可以做到“把对象保存到数据库”和“从数据库中取出的是对象”。

1.2、传统的开发模式


基于mvc的项目框架结构:entity / dao / service / action

// 1. 实体类
class User{
}


//2. dao
class  UserDao{
   .. 访问db
}

//3. service
class  UserService{
    UserDao userDao = new UserDao();
}

//4. action
class  UserAction{
    UserService userService = new UserService();

    ..
    拿到数据或结果
}


用户访问:/user.action ---->  Tomcat  (服务器创建Action、Service、dao)


1.3、思考


1. 对象创建创建能否写死?(HardCode)

2. 对象创建细节

对象数量

-->action  多个   【维护成员变量】

-->service 一个   【不需要维护公共变量】

-->dao     一个   【不需要维护公共变量】

创建时间

-->action    访问时候创建

-->service   启动时候创建

-->dao       启动时候创建

3. 对象的依赖关系

-->action 依赖 service

-->service依赖 dao


 

总结:spring就是解决上面的问题的,简单来说,就是处理对象的创建的、以及对象的依赖关系!


 

2、Spring框架


Spring框架,可以解决“对象创建”以及“对象之间依赖关系”的一种框架,且可以和其他框架一起使用(Spring与Struts,  Spring与hibernate),起到整合(粘合)作用的一个框架。


2.1、专业术语


组件/框架设计

侵入式设计,引入了框架,对现有的类的结构有影响;即需要实现或继承某些特定类。例如: Struts框架。

非侵入式设计,引入了框架,对现有的类结构没有影响。例如:Hibernate框架 / Spring框架。

控制反转

Inversion on Control , 控制反转 IOC。对象的创建交给外部容器完成,这个叫做“控制反转”.

依赖注入

dependency injection,处理对象的依赖关系

控制反转和依赖注入的区别

控制反转, 解决对象创建的问题 【对象创建交给别人】

依赖注入,在创建完对象后, 对象关系的处理就是依赖注入 【通过set方法依赖注入】

AOP

面向切面编程。切面,简单来说来可以理解为一个类,由很多重复代码形成的类。

切面举例:事务、日志、权限;


2.2、Spring的6大模块


Spring提供了一站式解决方案:

1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系

2) Spring Web  Spring对web模块的支持。

-->可以与struts整合,让struts的action创建交给spring

-->spring mvc模式

3) Spring DAO  Spring 对jdbc操作的支持  【JdbcTemplate模板工具类】

4) Spring ORM  spring对orm的支持

-->既可以与hibernate整合,

-->也可以使用spring的对hibernate操作的封装

5)Spring AOP  切面编程

6)SpringEE   spring 对javaEE其他模块的支持


技术分享


2.3、bean对象的创建细节



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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="user" class="com.rk.spring.a_helloworld.User" scope="prototype"
	lazy-init="false" init-method="init_user" destroy-method="destroy_user"></bean>

</beans>

User.java

package com.rk.spring.a_helloworld;

public class User
{
	private int id;
	private String name;
	
	public User()
	{
		System.out.println("---创建User对象---");
	}
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	
	public void init_user()
	{
		System.out.println("初始化用户");
	}
	
	public void destroy_user()
	{
		System.out.println("销毁用户");
	}
}

App_Create.java

package com.rk.spring.a_helloworld;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App_Create
{
	
	/**
	 * 1) 对象创建: 单例/多例
	 * 	scope="singleton", 默认值, 即 默认是单例	【service/dao/工具类】
	 *  scope="prototype", 多例; 				【Action对象】
	 * 
	 * 2) 什么时候创建?
	 *    scope="singleton"  在启动(容器初始化之前), 就已经创建了bean,且整个应用只有一个。
	 * 	  scope="prototype"  在用到对象的时候,才创建对象。
	 * 
	 * 3)是否延迟创建(只对单例有效)
	 * 	  lazy-init="false"  默认为false,  不延迟创建,即在启动时候就创建对象
	 * 	  lazy-init="true"   延迟初始化, 在用到对象的时候才创建对象
	 *    
	 * 4) 创建对象之后,初始化/销毁(经我测试,只对单例有效)
	 * 	  init-method="init_user"       【对应对象的init_user方法,在对象创建之后执行 】
	 *    destroy-method="destroy_user"  【在调用容器对象的destroy方法时候执行,(容器用实现类)】
	 */
	@Test
	public void testIOC()
	{
		System.out.println("-----1-----");
		// 得到IOC容器对象  【用实现类,因为要调用销毁的方法】
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("com/rk/spring/a_helloworld/applicationContext.xml");
		
		System.out.println("-----2-----");
		// 从容器中获取bean
		User user1 = (User) ac.getBean("user");
		User user2 = (User) ac.getBean("user");
		System.out.println("-----3-----");
		
		System.out.println("user1 == user2 : " + (user1 == user2));
		System.out.println(user1);
		System.out.println(user2);
		
		// 销毁容器对象 
		ac.destroy();
	}
	
}



2.4、Spring的IOC容器


SpringIOC容器,是spring核心内容。

作用: 创建对象 & 处理对象的依赖关系


2.4.1、创建对象


IOC容器创建对象,有几种方式:

1) 调用无参数构造器

2) 带参数构造器

3) 工厂创建对象

工厂类,静态方法创建对象

工厂类,非静态方法创建对象


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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- IOC容器的配置: 要创建的所有的对象都配置在这里-->
	
	<!-- ###############对象创建############### -->
	
	<!-- 1. 默认无参数构造器 -->
    <bean id="user1" class="com.rk.spring.b_ioc_container.User"></bean>
    
    <!-- 2. 带参数构造器 -->
    <bean id="user2" class="com.rk.spring.b_ioc_container.User">
    	<constructor-arg index="0" type="int" value="101"></constructor-arg>
    	<constructor-arg index="1" type="java.lang.String" value="Tom"></constructor-arg>
    </bean>
    
    <!-- 定义一个字符串,值是"Jack" ;  String s = new String("jack")-->
    <bean id="str" class="java.lang.String">
    	<constructor-arg index="0" type="java.lang.String" value="jack"></constructor-arg>
    </bean>
    <bean id="user3" class="com.rk.spring.b_ioc_container.User">
    	<constructor-arg index="0" type="int" value="102"></constructor-arg>
    	<constructor-arg index="1" type="java.lang.String" ref="str"></constructor-arg>
    </bean>    

	<!-- 3. 工厂类创建对象 -->
	<!-- # 3.1 工厂类,实例方法 -->
	<!-- 先创建工厂 -->
	<bean id="factory" class="com.rk.spring.b_ioc_container.ObjectFactory"></bean>
	<!-- 在创建user对象,用factory方的实例方法 -->
	<bean id="user4" factory-bean="factory" factory-method="getInstance"></bean>

	<!-- # 3.2 工厂类: 静态方法 -->
	<!-- 
		class 指定的就是工厂类型
		factory-method  一定是工厂里面的“静态方法”
	 -->	
	<bean id="user" class="com.rk.spring.b_ioc_container.ObjectFactory" factory-method="getStaticInstance"></bean>

	<!-- 对象写法 -->
	<!-- 
	问题:spring配置文件中,bean节点的id与name属性的区别?
		id 不能有特殊符号, 且唯一,且不能以数字开始
		name 可以有特殊符号
	 -->
	<bean id="test" name="1test" class="com.rk.spring.b_ioc_container.User"></bean>
</beans>

User.java

package com.rk.spring.b_ioc_container;

public class User
{
	private int id;
	private String name;
	
	public User()
	{
	}
	
	public User(int id, String name)
	{
		this.id = id;
		this.name = name;
	}

	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}

	@Override
	public String toString()
	{
		return "User [id=" + id + ", name=" + name + "]";
	}
	
}

ObjectFactory.java

package com.rk.spring.b_ioc_container;

import java.util.Random;

//工厂,创建对象
public class ObjectFactory
{
	private static User user = new User(200, "小明");
	
	public User getInstance()
	{
		Random rand = new Random();
		int nextInt = rand.nextInt(200);
		return new User(nextInt,"Lucy"+nextInt);
	}
	
	// 静态方法创建对象
	public static User getStaticInstance()
	{
		return user;
	}
}

App.java

package com.rk.spring.b_ioc_container;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
	ApplicationContext ac = new ClassPathXmlApplicationContext("com/rk/spring/b_ioc_container/applicationContext.xml");
	
	// 测试:对象创建
	@Test
	public void testIOC()
	{
		User user = (User) ac.getBean("user");
		System.out.println(user);
	}
	
	// 测试: 容器中对象的写法
	@Test
	public void test()
	{
		User user = (User) ac.getBean("1test");
		System.out.println(user);
	}
}

 


2.4.2、对象依赖关系


Spring中,如何给对象的属性赋值?  【DI, 依赖注入】

1) 通过构造函数

2) 通过setter方法给属性注入值

3) p名称空间

4) 自动装配(了解)

5) 注解


 

1) 通过构造函数

	<bean id="user1" class="com.rk.spring.d_di_property.User">
		<constructor-arg index="0" type="int" value="101"></constructor-arg>
		<constructor-arg index="1" type="java.lang.String" value="Tomcat"></constructor-arg>
	</bean>

 


2) 通过setter方法给属性注入值(常用)

	<bean id="user" class="com.rk.spring.d_di_property.User">
		<property name="id" value="102"></property>
		<property name="name" value="JBoss"></property>
	</bean>

案例 

	<!-- dao instance -->	
	<bean id="userDao" class="com.rk.spring.d_di_property.UserDao"></bean>
	
	<!-- service instance -->		
	<bean id="userService" class="com.rk.spring.d_di_property.UserService">
		<property name="userDao" ref="userDao"></property>
	</bean>	
	
	<!-- action instance -->	
	<bean id="userAction" class="com.rk.spring.d_di_property.UserAction">
		<property name="userService" ref="userService"></property>
	</bean>	

也可以使用内部bean的方式

	<bean id="userAction" class="com.rk.spring.d_di_property.UserAction">
		<property name="userService">
			<bean class="com.rk.spring.d_di_property.UserService">
				<property name="userDao">
					<bean class="com.rk.spring.d_di_property.UserDao"></bean>
				</property>
			</bean>
		</property>
	</bean>



3) p名称空间(优化)

	<!-- 
		给对象属性注入值:
			# p 名称空间给对象的属性注入值
			 (spring3.0以上版本才支持)
	 -->
	<bean id="userDao" class="com.rk.spring.d_di_property.UserDao"></bean>
	<bean id="userService" class="com.rk.spring.d_di_property.UserService" p:userDao-ref="userDao"></bean>
	<bean id="userAction" class="com.rk.spring.d_di_property.UserAction" p:userService-ref="userService" ></bean>

	<!-- 传统的注入: 
	 <bean id="user" class="cn.itcast.c_property.User" >
	 	<property name="name" value="xxx"></property>
	 </bean>
	-->
	<!-- p名称空间优化后 -->
	<bean id="user" class="com.rk.spring.d_di_property.User" p:id="103" p:name="Lily"></bean>	

 

完整的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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- ###############对象属性赋值############### -->
	<!--  1) 通过构造函数 -->	
	<bean id="user1" class="com.rk.spring.d_di_property.User">
		<constructor-arg index="0" type="int" value="101"></constructor-arg>
		<constructor-arg index="1" type="java.lang.String" value="Tomcat"></constructor-arg>
	</bean>

	<!-- 2) 通过setter方法给属性注入值 -->	
<!-- 	
	<bean id="user" class="com.rk.spring.d_di_property.User">
		<property name="id" value="102"></property>
		<property name="name" value="JBoss"></property>
	</bean>
 -->

	<!-- 
		案例:
			action/service/dao
	 -->
	<!-- dao instance -->	
	<!-- <bean id="userDao" class="com.rk.spring.d_di_property.UserDao"></bean> -->

	<!-- service instance -->	
<!-- 	
	<bean id="userService" class="com.rk.spring.d_di_property.UserService">
		<property name="userDao" ref="userDao"></property>
	</bean>
 -->
 
	<!-- action instance -->	
<!-- 	
	<bean id="userAction" class="com.rk.spring.d_di_property.UserAction">
		<property name="userService" ref="userService"></property>
	</bean>
 -->	

	<!-- ##############内部bean############## -->	
<!-- 
	<bean id="userAction" class="com.rk.spring.d_di_property.UserAction">
		<property name="userService">
			<bean class="com.rk.spring.d_di_property.UserService">
				<property name="userDao">
					<bean class="com.rk.spring.d_di_property.UserDao"></bean>
				</property>
			</bean>
		</property>
	</bean>
 -->
 
	<!-- 
		给对象属性注入值:
			# p 名称空间给对象的属性注入值
			 (spring3.0以上版本才支持)
	 -->
	<bean id="userDao" class="com.rk.spring.d_di_property.UserDao"></bean>
	<bean id="userService" class="com.rk.spring.d_di_property.UserService" p:userDao-ref="userDao"></bean>
	<bean id="userAction" class="com.rk.spring.d_di_property.UserAction" p:userService-ref="userService" ></bean>

	<!-- 传统的注入: 
	 <bean id="user" class="cn.itcast.c_property.User" >
	 	<property name="name" value="xxx"></property>
	 </bean>
	-->
	<!-- p名称空间优化后 -->
	<bean id="user" class="com.rk.spring.d_di_property.User" p:id="103" p:name="Lily"></bean>	
</beans>

User.java

package com.rk.spring.d_di_property;

public class User
{
	private int id;
	private String name;
	
	public User()
	{
	}
	public User(int id, String name)
	{
		this.id = id;
		this.name = name;
	}
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	@Override
	public String toString()
	{
		return "User [id=" + id + ", name=" + name + "]";
	}
	
}

UserDao.java

package com.rk.spring.d_di_property;

public class UserDao
{
	public void save(User user)
	{
		System.out.println("保存用户成功:" + user);
	}
}

UserService.java

package com.rk.spring.d_di_property;

public class UserService
{
	private UserDao userDao;

	public UserDao getUserDao()
	{
		return userDao;
	}

	public void setUserDao(UserDao userDao)
	{
		this.userDao = userDao;
	}
	
	public void save(User user)
	{
		userDao.save(user);
	}
}

UserAction.java

package com.rk.spring.d_di_property;

public class UserAction
{
	private UserService userService;

	public UserService getUserService()
	{
		return userService;
	}

	public void setUserService(UserService userService)
	{
		this.userService = userService;
	}
	
	public void save(User user)
	{
		userService.save(user);
	}
}

App.java

package com.rk.spring.d_di_property;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
	private ApplicationContext ac = new ClassPathXmlApplicationContext("/com/rk/spring/d_di_property/applicationContext.xml");
	
	@Test
	public void testIOC()
	{
		User user = (User) ac.getBean("user");
		System.out.println(user);
	}
	
	@Test
	public void test()
	{
		User user = (User) ac.getBean("user");
		UserAction userAction = (UserAction) ac.getBean("userAction");
		userAction.save(user);
	}
	
}


4) 自动装配

根据名称自动装配:autowire="byName"

自动去IOC容器中找与属性名同名的引用的对象,并自动注入

	<bean id="userDao" class="com.rk.spring.e_autowire.UserDao" autowire="byName"></bean>
	<bean id="userService" class="com.rk.spring.e_autowire.UserService" autowire="byName"></bean>
	<bean id="userAction" class="com.rk.spring.e_autowire.UserAction" autowire="byName"></bean>

 

根据类型自动装配:autowire="byType"

必须确保改类型在IOC容器中只有一个对象;否则报错。

	<bean id="userDao" class="com.rk.spring.e_autowire.UserDao" autowire="byType"></bean>
	<bean id="userService" class="com.rk.spring.e_autowire.UserService" autowire="byType"></bean>
	<bean id="userAction" class="com.rk.spring.e_autowire.UserAction" autowire="byType"></bean>

 

也可以定义到全局, 这样就不用每个bean节点都去写autowire=”byName”

<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
        default-autowire="byType"><!-- 全局配置 -->

	<!-- ###############自动装配############### -->  

	<bean id="userDao" class="com.rk.spring.e_autowire.UserDao"></bean>
	<bean id="userService" class="com.rk.spring.e_autowire.UserService"></bean>
	<bean id="userAction" class="com.rk.spring.e_autowire.UserAction"></bean>
	
</beans>

 

完整的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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
        default-autowire="byType">

	<!-- ###############自动装配############### -->  
<!-- 
	<bean id="userDao" class="com.rk.spring.e_autowire.UserDao" autowire="byName"></bean>
	<bean id="userService" class="com.rk.spring.e_autowire.UserService" autowire="byName"></bean>
	<bean id="userAction" class="com.rk.spring.e_autowire.UserAction" autowire="byName"></bean>
-->

	<!-- 如果根据类型自动装配: 必须确保IOC容器中只有一个该类型的对象 -->
<!-- 
	<bean id="userDao" class="com.rk.spring.e_autowire.UserDao" autowire="byType"></bean>
	<bean id="userService" class="com.rk.spring.e_autowire.UserService" autowire="byType"></bean>
	<bean id="userAction" class="com.rk.spring.e_autowire.UserAction" autowire="byType"></bean>
 -->	

	<bean id="userDao" class="com.rk.spring.e_autowire.UserDao"></bean>
	<bean id="userService" class="com.rk.spring.e_autowire.UserService"></bean>
	<bean id="userAction" class="com.rk.spring.e_autowire.UserAction"></bean>
	
	<!--   报错: 因为上面已经有一个该类型的对象,且使用了根据类型自动装配 -->
	<!-- <bean id="userService2" class="com.rk.spring.e_autowire.UserService"></bean> -->
</beans>

UserDao.java

package com.rk.spring.e_autowire;

public class UserDao
{
	public void save()
	{
		System.out.println("保存用户成功");
	}
}

UserService.java

package com.rk.spring.e_autowire;

public class UserService
{
	private UserDao user_dao;

	public UserDao getUserDao()
	{
		return user_dao;
	}

	public void setUserDao(UserDao user_dao)
	{
		this.user_dao = user_dao;
	}
	
	public void save()
	{
		user_dao.save();
	}
}

UserAction.java

package com.rk.spring.e_autowire;

public class UserAction
{
	private UserService user_service;

	public UserService getUserService()
	{
		return user_service;
	}

	public void setUserService(UserService user_service)
	{
		this.user_service = user_service;
	}
	
	public void save()
	{
		user_service.save();
	}
}

App.java

package com.rk.spring.e_autowire;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
	private ApplicationContext ac = new ClassPathXmlApplicationContext("/com/rk/spring/e_autowire/applicationContext.xml");
	
	@Test
	public void testIOC()
	{
		UserAction userAction = (UserAction) ac.getBean("userAction");
		userAction.save();
	}
	
}


总结:Spring提供的自动装配主要是为了简化配置; 但是不利于后期的维护。(一般不推荐使用)

 

5) 注解

注解方式可以简化spring的IOC容器的配置!

使用注解步骤:

1)先引入context名称空间

xmlns:context="http://www.springframework.org/schema/context"

2)开启注解扫描

	<context:component-scan base-package="com.rk.spring.f_annotation"></context:component-scan>

3)使用注解

通过注解的方式,把对象加入ioc容器。

创建对象以及处理对象依赖关系,相关的注解:

@Component   指定把一个对象加入IOC容器

@Repository   作用同@Component; 在持久层使用

@Service      作用同@Component; 在业务逻辑层使用

@Controller    作用同@Component; 在控制层使用

@Resource     属性注入


方案一

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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
        default-autowire="byType">

	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.rk.spring.f_annotation"></context:component-scan>

</beans>

UserDao.java

package com.rk.spring.f_annotation;

import org.springframework.stereotype.Component;

@Component("userDao")
public class UserDao
{
	public void save()
	{
		System.out.println("保存用户成功");
	}
}

UserService.java

package com.rk.spring.f_annotation;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

@Component("userService")
public class UserService
{
	@Resource(name = "userDao")
	private UserDao user_dao;

	public UserDao getUserDao()
	{
		return user_dao;
	}

	public void setUserDao(UserDao user_dao)
	{
		this.user_dao = user_dao;
	}
	
	public void save()
	{
		user_dao.save();
	}
}

UserAction.java

package com.rk.spring.f_annotation;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

@Component("userAction")
public class UserAction
{
	@Resource(name="userService")
	private UserService user_service;

	public UserService getUserService()
	{
		return user_service;
	}

	public void setUserService(UserService user_service)
	{
		this.user_service = user_service;
	}
	
	public void save()
	{
		user_service.save();
	}
}

App.java

package com.rk.spring.f_annotation;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
	private ApplicationContext ac = new ClassPathXmlApplicationContext("/com/rk/spring/f_annotation/applicationContext.xml");
	
	@Test
	public void testIOC()
	{
		UserAction userAction = (UserAction) ac.getBean("userAction");
		userAction.save();
	}
	
}


方案二


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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
        default-autowire="byType">

	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.rk.spring.g_annotation2"></context:component-scan>

</beans>

UserDao.java

package com.rk.spring.g_annotation2;

import org.springframework.stereotype.Repository;

//把当前对象加入ioc容器
//@Component("userDao")   //  相当于bean.xml 【<bean id=userDao class=".." />】

//@Component  // 加入ioc容器的UserDao对象的引用名称, 默认与类名一样, 且第一个字母小写

@Repository // 在持久层可以选择用这个注解
public class UserDao
{
	public void save()
	{
		System.out.println("保存用户成功");
	}
}

UserService.java

package com.rk.spring.g_annotation2;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Service // 表示业务逻辑层的组件
public class UserService
{
	//@Resource(name = "userDao")  // 根据名称查找
	@Resource //  根据类型查找 【在容器中要确保该类型只有一个变量】
	private UserDao user_dao; // 去容器中找UserDao类型的变量,找到后就赋值

	public UserDao getUserDao()
	{
		return user_dao;
	}

	public void setUserDao(UserDao user_dao)
	{
		this.user_dao = user_dao;
	}
	
	public void save()
	{
		user_dao.save();
	}
}

UserAction.java

package com.rk.spring.g_annotation2;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

@Controller // 控制层的组件
public class UserAction
{
	@Resource
	private UserService user_service;

	public UserService getUserService()
	{
		return user_service;
	}

	public void setUserService(UserService user_service)
	{
		this.user_service = user_service;
	}
	
	public void save()
	{
		user_service.save();
	}
}

App.java

package com.rk.spring.g_annotation2;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
	private ApplicationContext ac = new ClassPathXmlApplicationContext("/com/rk/spring/g_annotation2/applicationContext.xml");
	
	@Test
	public void testIOC()
	{
		UserAction userAction = (UserAction) ac.getBean("userAction");
		userAction.save();
	}
	
}


 

总结:

1) 使用注解,可以简化配置,且可以把对象加入IOC容器,及处理依赖关系(DI)

2) 注解可以和XML配置一起使用。

 



3、Spring和Struts框架整合


Spring,负责对象对象创建

Struts, 用Action处理请求

Spring与Struts框架整合,关键点:让struts框架action对象的创建,交给spring完成!

 

SSH整合:

Spring与Struts整合的关键点: action交给spring创建!

Spring与Hibernate整合的关键点:sessionFactory对象交给spring创建!

 

Spring与Struts框架整合的步骤:

引入jar文件:

1)引入struts的 .jar相关文件

2)spring-core  相关jar文件

3)spring-web 支持jar包

spring-web-3.2.5.RELEASE.jar 【Spring源码】

struts2-spring-plugin-2.3.4.1.jar      【Struts源码】

配置:

4)配置XML

struts.xml 【struts路径与action映射配置】

beans.xml    【spring ioc容器配置】

web.xml 【核心过滤器: 引入struts功能】【初始化spring的ioc容器】


5) 代码以及配置



整合项目的结构

技术分享


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">
	<display-name></display-name>	 

	<!-- 1. struts配置 -->  
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>  
 
 	<!-- 2. spring 配置 -->
 	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/classes/beans-*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
 
 

	 <welcome-file-list>
	   <welcome-file>index.jsp</welcome-file>
	 </welcome-file-list>
</web-app>

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="false" />

    <package name="my_spring_struts_package" namespace="/" extends="struts-default">
		<action name="saveUser" class="userAction" method="save">
			<result name="success" type="dispatcher">/success.jsp</result>
		</action>
    </package>
</struts>

beans-entity.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
	
	<bean id="user" class="com.rk.entity.User"></bean>
	
</beans>

beans-dao.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
	
	<bean id="userDao" class="com.rk.dao.UserDao"></bean>
	
</beans>

beans-service.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
	
	<bean id="userService" class="com.rk.service.UserService">
		<property name="user_dao" ref="userDao"></property>
	</bean>
	
</beans>

beans-action.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
	
	<bean id="userAction" class="com.rk.action.UserAction" scope="prototype">
		<property name="user_service" ref="userService"></property>
		<property name="user" ref="user"></property>
	</bean>
	
</beans>

User.java

package com.rk.entity;

public class User
{
	private int id;
	private String name;
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	@Override
	public String toString()
	{
		return "User [id=" + id + ", name=" + name + "]";
	}
	
}

UserDao.java

package com.rk.dao;

import com.rk.entity.User;

public class UserDao
{
	public void save(User user)
	{
		System.out.println("用户保存成功:" + user);
	}
}

UserService.java

package com.rk.service;

import com.rk.dao.UserDao;
import com.rk.entity.User;

public class UserService
{
	private UserDao user_dao;

	public UserDao getUser_dao()
	{
		return user_dao;
	}

	public void setUser_dao(UserDao user_dao)
	{
		this.user_dao = user_dao;
	}
	
	public void save(User user)
	{
		user_dao.save(user);
	}
}

UserAction.java

package com.rk.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.rk.entity.User;
import com.rk.service.UserService;

public class UserAction extends ActionSupport implements ModelDriven<User>
{
	private User user;
	private UserService user_service;
	
	public User getUser()
	{
		return user;
	}

	public void setUser(User user)
	{
		this.user = user;
	}

	public UserService getUser_service()
	{
		return user_service;
	}

	public void setUser_service(UserService user_service)
	{
		this.user_service = user_service;
	}

	@Override
	public User getModel()
	{
		return user;
	}

	public String save()
	{
		System.out.println(user);
		user_service.save(user);
		
		return Action.SUCCESS;
	}


}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>保存用户</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  
  <body>
    <form action="${pageContext.request.contextPath }/saveUser.action" method="post">
    	<label for="input_id">用户id:</label>
    	<input id="input_id" name="user.id"/>
    	<br/>
    	
    	<label for="input_name">用户名:</label>
    	<input id="input_name" name="user.name"/>
    	<br/>
    	
    	<input type="submit" value="提交"/>
    </form>
  </body>
</html>

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>保存成功</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
</head>
<body>
	用户id:<s:property value="id"/> <br/>
	用户名称:<s:property value="name"/> <br/>
	<s:debug></s:debug>
</body>
</html>




(2)Spring框架

标签:spring

原文地址:http://lsieun.blog.51cto.com/9210464/1828542

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!