一、首先是基于XML配置的依赖注入实例
在本实例中,Spring MVC并非主要讲解内容,其文件范式不再重复,而有关依赖注入文件包括:接口类car.java,实现了car接口的Taxi,java和Train.java。在User类中,有一个Car对象属性。即此Car即为需要注入的对象。然后是配置的文件,applicationContext.xml,其中包含了Bean的定义。
下面是各个文件的内容。
1.user,java
package com.zjn.entity;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
/**
* @author zjn
*/
private static final long serialVersionUID = 1L;
private String name; // name
private String pwd; // pwd
private Integer age; // age
private String sex;
private Car car;
//全部实现了set和get方法, 以此完成依赖注入(设值注入)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex=sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public void run() {
String runtype=car.getType();
System.out.println(runtype);
}
}
2.接口类Car和它的具体类Taxi和Train。
package com.zjn.entity;
public interface Car {
public String getType();
}
package com.zjn.entity;
public class Taxi implements Car{
@Override
public String getType() {
// TODO Auto-generated method stub
return "His car is a taxi!";
}
}
package com.zjn.entity;
public class Train implements Car {
@Override
public String getType() {
// TODO Auto-generated method stub
return "Wow!He has a train!";
}
}
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="taxi" class="com.zjn.entity.Taxi">
</bean>
<bean id="train" class="com.zjn.entity.Train">
</bean>
<bean id="user" class="com.zjn.entity.User">
<property name="name" value="zfh14"/>
<property name="pwd" value="19961006"/>
<property name="age" value="12"/>
<property name="sex" value="B"/>
<property name="car" ref="train"/>
</bean>
</beans>
4.然后是调用了User对象的UserController,也就是Spring MVC中的Controller。
package com.zjn.controller;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.zjn.entity.Taxi;
import com.zjn.entity.Train;
import com.zjn.entity.User;
import com.zjn.form.UserForm;
/**
* 用户管理
*
* @author zjn
*/
@Controller
public class UserController {
@RequestMapping("login")
public String Login(Model model) {
return "login";
}
@RequestMapping("loginTo")
public String Save(@ModelAttribute("form") UserForm userform, Model model) { // user:视图层传给控制层的表单对象;model:控制层返回给视图层的对象
System.out.println("the input userform values:"+userform.getName()+","+userform.getSex()+","+userform.getPwd()+","+userform.getAge()+","+userform.getCar());
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/zjn/controller/applicationContext.xml");
User user = (User) applicationContext.getBean("user");
user.run();
System.out.println("the original user values:"+user.getName()+","+user.getSex()+","+user.getPwd()+","+user.getAge()+","+user.getCar());
user.setName(userform.getName());
user.setAge(userform.getAge());
user.setSex(userform.getSex());
user.setPwd(userform.getPwd());
if(userform.getCar().equals("Taxi")) {
user.setCar(new Taxi());
}else if(userform.getCar().equals("Train")) {
user.setCar(new Train());
}
System.out.println("the input user values:"+user.getName()+","+user.getSex()+","+user.getPwd()+","+user.getAge()+","+user.getCar());
model.addAttribute("user", user);
return "detail";
}
}
此处要注意ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/zjn/controller/applicationContext.xml");这一行中配置文件的地址。。。不知道为什么放在WebContent下识别不了。可能是之前写的地址不对吧。
恩,这样,主要的关于依赖注入的部分就全了。
二、基于注解的依赖注入实例,在上面的基于XMl配置的实例基础上进行修改而成。
首先,删除applicationContext.xml。然后,因为初次接触的原因,模仿了之前找到的一个例子,添加一个UserService.java接口和一个UserServiceImpl.java类。其中,后一个实体类就是针对依赖注入而设计的。
1.UserService,java
package com.zjn.service;
import com.zjn.entity.User;
public interface UserService {
public User getUser();
}
UserServiceImpl.java
package com.zjn.service;
import org.springframework.stereotype.Service;
import com.zjn.entity.Train;
import com.zjn.entity.User;
@Service
public class UserServiceImpl implements UserService{
private User user;
public UserServiceImpl() {
user=new User();
user.setName("zfh");
user.setAge(22);
user.setSex("B");
user.setPwd("123789");
user.setCar(new Train());
}
@Override
public User getUser() {
// TODO Auto-generated method stub
return user;
}
}
如上,采用构造注入的方式。在下面的UserController类中,控制器每次接受到loginTo请求后,都会去保存表单的内容,将表单内容保存在User类中,而这个User类并不是通过new实现的,而是通过UserService的getUser方法来实现的。
而UserService,也并不需要(或者说不能)进行new UserService()
2.UserController.java
package com.zjn.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.zjn.entity.Taxi;
import com.zjn.entity.Train;
import com.zjn.entity.User;
import com.zjn.form.UserForm;
import com.zjn.service.UserService;
@Controller
public class UserController {
@Autowired
UserService userService;
@RequestMapping("login")
public String Login(Model model) {
return "login";
}
@RequestMapping("loginTo")
public String Save(@ModelAttribute("form") UserForm userform, Model model) { // user:视图层传给控制层的表单对象;model:控制层返回给视图层的对象
System.out.println("the input userform values:"+userform.getName()+","+userform.getSex()+","+userform.getPwd()+","+userform.getAge()+","+userform.getCar());
User user = userService.getUser();
//
System.out.println("the original user values:"+user.getName()+","+user.getSex()+","+user.getPwd()+","+user.getAge()+","+user.getCar());
user.run();
user.setName(userform.getName());
user.setAge(userform.getAge());
user.setSex(userform.getSex());
user.setPwd(userform.getPwd());
if(userform.getCar().equals("Taxi")) {
user.setCar(new Taxi());
}else if(userform.getCar().equals("Train")) {
user.setCar(new Train());
}
System.out.println("the input user values:"+user.getName()+","+user.getSex()+","+user.getPwd()+","+user.getAge()+","+user.getCar());
user.run();
model.addAttribute("user", user);
return "detail";
}
}
然后,因为不存在new UserService的情况,所以,这里的userService是Spring容器自己提供的。故而,需要在配置文件中扫描UserService和UserServiceImpl所在的包。。我是直接扫描了所有的包。。
恩,贴一下springmvc-servlet.xml的配置文件吧。
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
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 ">
<mvc:annotation-driven />
<!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.zjn" />
<!-- 这两个类用来启动基于Spring MVC的注解功能,将控制器与方法映射加入到容器中 -->
<beans:bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<beans:bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- 这个类用于Spring MVC视图解析 -->
<beans:bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/pages/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
</beans:beans>
ok!