Spring IoC学习之基于Annotation的IoC
前面简单总结了一下基于XML方式的IoC。
这里基于上一个文章的代码,总结一下基于Annotation(注解)方式的IoC。
项目还是采用maven构建(不会maven的 可以下载相关的jar包使用,效果是一样的),以下是项目结构
首先是pom中的依赖。这里直接贴代码了 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yijia</groupId>
<artifactId>spring_ioc_annotation</artifactId>
<version>1.0-SNAPSHOT</version>
<name>spring_ioc_annotation</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring.version>4.3.13.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
嗯。。。。这里的代码还是基于上一篇(Spring IoC学习之基于XML的IoC)的代码修改的。
所以,代码几乎不变,先看model层吧。
在User类上面加入注解@Component 如图所示:
User.java代码
import org.springframework.stereotype.Component;
@Component
public class User {
private int id;
private String username;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public User() {
}
public User(int id, String username) {
super();
this.id = id;
this.username = username;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + "]";
}
}
然后,dao层接口的内容不变:IUserDao.java
实现类UserDao.java加入注解 @Repository
IUserDao.java代码
public interface IUserDao {
public void add(User user);
public void delete(int id);
public User load(int id);
}
UserDao.java代码
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDao implements IUserDao {
public void add(User user) {
System.out.println("add user:" + user);
}
public void delete(int id) {
System.out.println("delete user:" + id);
}
public User load(int id) {
System.out.println("load:" + id);
return null;
}
}
然后,service层UserService.java接口类不变
实现类UserServiceImpl.java中加入相应的注解
UserService.java代码
public interface UserService {
public void add(User user);
public void delete(int id);
public User load(int id);
}
UserServiceImpl.java代码
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("userService")
public class UserServiceImpl implements UserService {
private IUserDao userDao;
public IUserDao getUserDao() {
return userDao;
}
@Resource(name="userDao")
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
public void add(User user) {
userDao.add(user);
}
public void delete(int id) {
userDao.delete(id);
}
public User load(int id) {
return userDao.load(id);
}
}
然后controller层:UserController.java
在相应位置加入注解
UserController.java代码
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller("userController")
public class UserController {
private User user;
private UserService userService;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public UserService getUserService() {
return userService;
}
@Resource(name = "userService")
public void setUserService(UserService userService) {
this.userService = userService;
}
public void add() {
userService.add(user);
}
public void delete() {
userService.delete(id);
}
public void load() {
userService.load(id);
}
}
然后配置beans.xml
引入相关schema并配置扫描注解的包
<context:component-scan base-package="com.yijia.spring_ioc_annotation"/>
beans.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"
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">
<!--<context:annotation-config/>-->
<!--
The use of <context:component-scan> implicitly enables the functionality of <context:annotation-config>.
There is usually no need to include the <context:annotation-config> element when using <context:component-scan>.
意思就是<context:component-scan>标签的使用隐式支持<context:annotationconfig>的功能。
在使用<context:component-scan>时,通常不需要包含<context:annotationconfig>元素
-->
<!--
下面这个标签的意思就是对使用注解的类进行扫描
扫描spring_ioc_annotation包下所有的类包括子包
-->
<context:component-scan base-package="com.yijia.spring_ioc_annotation"/>
</beans>
最后使用Junit测试一下
测试类TestSpring.java代码
public class TestSpring {
BeanFactory beanFactory;
@Before
public void load() {
beanFactory = new ClassPathXmlApplicationContext("beans.xml");
}
@Test
public void testUser() {
UserController userController = (UserController) beanFactory.getBean("userController");
System.out.println(userController.getUser());
User u = new User(1, "这是用户名");
userController.setUser(u);
userController.add();
}
}
测试结果:
由于代码几乎是基于上一篇(Spring IoC学习之基于XML的IoC),所以很多代码没有做过多的解释。这里主要总结了一下基于Annotation的IoC相关步骤。