天天看点

Spring IoC学习之基于Annotation的IoC

前面简单总结了一下基于XML方式的IoC。

这里基于上一个文章的代码,总结一下基于Annotation(注解)方式的IoC。

项目还是采用maven构建(不会maven的 可以下载相关的jar包使用,效果是一样的),以下是项目结构

Spring IoC学习之基于Annotation的IoC

首先是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 如图所示:

Spring IoC学习之基于Annotation的IoC

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

Spring IoC学习之基于Annotation的IoC
实现类UserDao.java加入注解 @Repository      
Spring IoC学习之基于Annotation的IoC

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中加入相应的注解

Spring IoC学习之基于Annotation的IoC

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

在相应位置加入注解

Spring IoC学习之基于Annotation的IoC

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学习之基于Annotation的IoC

由于代码几乎是基于上一篇(Spring IoC学习之基于XML的IoC),所以很多代码没有做过多的解释。这里主要总结了一下基于Annotation的IoC相关步骤。