[关闭]
@martin0207 2018-04-23T14:25:39.000000Z 字数 3543 阅读 952

Spring学习——IOC由Annotation实现

Java学习


基本使用

配置文件

在src文件夹下,创建xml文件,这个文件放置Spring的配置。一般使用beans.xml做名字。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. <!-- 打开Spring的Annotation -->
  10. <context:annotation-config/>
  11. <!-- 设定Spring去那些包中找Annotation -->
  12. <context:component-scan base-package="spring"></context:component-scan>
  13. </beans>

创建几个功能类

User类

  1. public class User {
  2. private int id;
  3. private String name;
  4. public User(int id, String name) {
  5. this.id = id;
  6. this.name = name;
  7. }
  8. public User() {
  9. }
  10. public int getId() {
  11. return id;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. @Override
  23. public String toString() {
  24. return "User [id=" + id + ", name=" + name + "]";
  25. }
  26. }

UserDao类

  1. public class UserDao {
  2. public void add(User user) {
  3. System.out.println("add " + user);
  4. }
  5. public void delete(int id) {
  6. System.out.println("delete " + id);
  7. }
  8. }

UserService类

  1. public class UserService {
  2. private UserDao userDao;
  3. private User user;
  4. public void add() {
  5. userDao.add(user);
  6. }
  7. public void delete(int id) {
  8. userDao.delete(id);
  9. }
  10. public UserDao getUserDao() {
  11. return userDao;
  12. }
  13. public void setUserDao(UserDao userDao) {
  14. this.userDao = userDao;
  15. }
  16. public User getUser() {
  17. return user;
  18. }
  19. public void setUser(User user) {
  20. this.user = user;
  21. }
  22. }

添加类注解

以上三个类中,UserDao和UserService类需要注解,我们在类的上面添加注解:

  1. @Component("userDao")
  2. public class UserDao {
  3. ……
  4. }
  1. @Component("userService")
  2. public class UserService {
  3. ……
  4. }

类注解添加完成后,还需要对变量的set方法添加注解resource

  1. @Component("userService")
  2. public class UserService {
  3. private UserDao userDao;
  4. private User user;
  5. public void add() {
  6. userDao.add(user);
  7. }
  8. public void delete(int id) {
  9. userDao.delete(id);
  10. }
  11. public UserDao getUserDao() {
  12. return userDao;
  13. }
  14. //默认通过名称注入,在JSR330中提供了@Inject来注入
  15. @Resource
  16. public void setUserDao(UserDao userDao) {
  17. this.userDao = userDao;
  18. }
  19. public User getUser() {
  20. return user;
  21. }
  22. public void setUser(User user) {
  23. this.user = user;
  24. }
  25. }

测试

创建测试类

  1. public class TestIoc {
  2. private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
  3. @Test
  4. public void test01() {
  5. User user = new User(1,"annotation");
  6. UserService service = factory.getBean("userService",UserService.class);
  7. service.setUser(user);
  8. service.add();
  9. service.delete(11);
  10. }
  11. }

测试结果

  1. add User [id=1, name=annotation]
  2. delete 11

运行一遍之后,相信已经了解Annotation实现IOC的流程。相较于xml的实现,Annotation的实现更加简单便捷。具体取舍看个人的喜好。

注解的细化

我们当然可以使用@Component来对注入类注解,但是Spring提供了更细化的注解,让编程者更清楚的区分各个类

注解 含义
@Component 是公共的,创建bean的注解
@Repository 专门用于Dao注入的注解,数据库处理
@Service 业务层注解
@Controller action作为控制器,一般用这个注解

单例/多例注解

记得上篇Spring学习——IOC由xml实现讲过,bean中有scope属性,可以设置注入类的单例/多例模式。
那么来到Annotation实现IOC时,我们就需要使用@Scope注解来设置单例/多例模式:

  1. @Component("userService")
  2. @Scope("prototype")
  3. public class UserService {
  4. ……
  5. }

可以自己做个简单测试,这里不做赘述。

非注入类的变量注解

上一篇Blog看的仔细,那么猜猜或许能够猜到如何实现,对,使用value。

  1. @Component("user")
  2. public class User {
  3. private int id;
  4. private String name;
  5. public User(int id, String name) {
  6. this.id = id;
  7. this.name = name;
  8. }
  9. public User() {
  10. }
  11. public int getId() {
  12. return id;
  13. }
  14. @Value("22")
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. @Value("注解名")
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. @Override
  26. public String toString() {
  27. return "User [id=" + id + ", name=" + name + "]";
  28. }
  29. }

在UserService的setUser方法上添加@Resource注解,并且修改测试方法为:

  1. @Test
  2. public void test01() {
  3. // User user = new User(1,"annotation");
  4. UserService service = factory.getBean("userService",UserService.class);
  5. // service.setUser(user);
  6. service.add();
  7. service.delete(11);
  8. }

测试结果

  1. add User [id=22, name=注解名]
  2. delete 11

最后

学习中,如果有错误或不足之处,请留言告诉我,我会尽快回复并改正。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注