接上一篇博客从spring到springmvc到springboot到springcloud(一).。上一篇说依赖注入,重点说bean。继续。
按照: 【Maven项目转换:quickstart转web】.将项目转化为网页项目,这里引入spring mvc项目。
在上一篇博客中,有句话,没交代清楚,就是定义了bean之后,如何使用?我只说,加个注解然后调用,这一篇咱们来恰一恰这句话。
在使用的时候总不能每次都这么来调用bean吧?一次一次的从上下文get,applicationContext.getBean这种使用方式简直不堪入目了。
那怎么办呢?
开始,动手。在这上一篇博客,写了个bean的例子,这里稍微改动一下:
<bean id = "userDao" class="io.demo.dao.daoImpl.UserDaoImpl"></bean>
<bean id = "UserService" class="io.demo.service.serviceImpl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
定义了两个bean,在userService里面有个元素:
<property name="userDao" ref="user"></property>。
这里是说在service里面,想要把userDao注入进来,而userDao是user这个bean。
改造文档结构,新建package,对应的interface和class:
在xml中,把UserDao、UserService定义成为bean。新建个controller:
叫FirstSpringMvc,代码如下:
package io.demo.controller;
import java.util.LinkedList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import io.demo.entity.User;
import io.demo.service.UserService;
@Controller
public class FirstSpringMvc {
@Autowired
UserService userService;
@RequestMapping(value = "req1" , method = RequestMethod.GET)
public String req1() {
LinkedList<User> userList = (LinkedList<User>)userService.queryUsers();
for(User user: userList) {
System.out.println(user.getName() + "\t身高:" + user.getHeight() + "cm\t体重:" + user.getWeight() + "kg\t国籍/所在地:" + user.getAddress());
}
return "success";
}
@RequestMapping(value = "req2" , params = {"username" , "age!=10"})
public String req2() {
return "success";
}
@RequestMapping(value = "req3" , method = RequestMethod.GET , headers = {"Accept-Language = zh-CN,zh;q=0.9"})
public String req3() {
return "success";
}
@RequestMapping(value = "req4/{name}")
public String req4(@PathVariable("name") String name) {
System.out.println("---------------------> name: " + name);
return "success";
}
}
这FirstSpringMv里面有这两行:
@Autowired
UserService userService;
是把UserService这个bean注入进来,完成它的初始化。在userService的实现类代码为:
package io.demo.service.serviceImpl;
import java.util.List;
import io.demo.dao.UserDao;
import io.demo.entity.User;
import io.demo.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public UserServiceImpl(UserDao userDao) {
super();
this.userDao = userDao;
}
@Override
public List<User> queryUsers() {
return userDao.queryUsers();
}
}
并没有实例化UserDao,只定义了UserDao有get、set方法。玄机在bean的配置中:
<bean id = "UserService" class="io.demo.service.serviceImpl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
在userService这个bean里面,userDao被注入了,定义了property,这是使用的是set方法注入。
总结一下,userService这个 bean使用了自动注解(@Autowired)注入;userDao这个bean使用到userDao采用的是set方法注入,调试一下我的代码,因为是网页项目,添加到tomcat中调试:
可以看到userService、userDao均被实例化,调试出结果。
这里讲到了使用注解,自动装配;使用set方法注入。这里先有个概念,下一篇博客,细细说这个注解、装配的原理,这一篇把这注入的方式、定义先给熟悉了。