为了账号安全,请及时绑定邮箱和手机立即绑定

Spring深入浅出(三)XML方式以及注解的方式操作IOC

标签:
Java

在日常的开发过程中,我们把程序分为3层:Controller层,Service层,DAO层。Controller类似于Servlet,也就是MVC中的控制层。

调用的顺序是:

    Controller层调用Service层,Service层调用DAO层,并且Service层和DAO层为接口(符合Java开发的面向接口编程),是一个典型的MVC模式。

基于xml配置方式

 步骤:

  1、创建一个Controller类,Service接口,Service的实现类,DAO的接口以及DAO的实现类

复制代码

 1 //Controller类 2 public class UserController { 3  4     private UserService userService; 5  6     public UserService getUserService() { 7         return userService; 8     } 9 10     public void setUserService(UserService userService) {11         this.userService = userService;12     }13 14     public User getUserById(int id){15         return userService.getUserById(id);16     }17 }18 //Service接口19 public interface UserService {20     public User getUserById(int id);21 }22 //Service的实现类23 public class UserServiceImpl implements UserService{24 25     private UserDAO userDAO;26 27     public UserDAO getUserDAO() {28         return userDAO;29     }30 31     public void setUserDAO(UserDAO userDAO) {32         this.userDAO = userDAO;33     }34 35     @Override36     public User getUserById(int id) {37         // TODO Auto-generated method stub38         return userDAO.getUserById(id);39     }40 41 }42 //DAO接口43 public interface UserDAO {44     public User getUserById(int id);45 }46 47 //DAO的实现类48 public class UserDAOImpl implements UserDAO{49 50     private static Map<Integer,User> users;51 52     static{53         users = new HashMap<Integer,User>();54         users.put(1, new User(1, "张三"));55         users.put(2, new User(2, "李四"));56         users.put(3, new User(3, "王五"));57     }58 59     @Override60     public User getUserById(int id) {61         // TODO Auto-generated method stub62         return users.get(id);63     }64 65 }

复制代码

  2、创建一个实体类

复制代码

public class User {    private int id;    private String name;    public int getId() {        return id;
    }    public void setId(int id) {        this.id = id;
    }    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    public User(int id, String name) {        super();        this.id = id;        this.name = name;
    }    public User() {        super();
    }

}

复制代码

  3.在spring的配置文件中配置Controller,Service,DAO三层,并完成依赖注入。

  说明:由上面的代码可以看出来,在Controller中有Service属性,在Service中有DAO属性,在DAO中没有任何属性,因此在DAO中不需要依赖注入,在Service中需要注入DAO,在Controller中需要注入Service。

复制代码

<?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.xsd">

    <!-- 配置Controller层 -->
    <bean id="userController" class="com.test.controller.UserController">
        <property name="userService" ref="userService"></property>
    </bean>

    <!-- 配置Service层 -->
    <bean id="userService" class="com.test.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO"></property>
    </bean>

    <!-- 配置DAO层 -->
    <bean id="userDAO" class="com.test.dao.impl.UserDAOImpl"></bean></beans>

复制代码

   4、测试,查看结果

复制代码

public class Test {    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserController userController = (UserController) applicationContext.getBean("userController");
        User user = userController.getUserById(1);
        System.out.println(user);
    }
}

复制代码

基于注解的方式

上述描述是在配置文件中进行注入,而实际开发中,最常用的是使用基于注解的方式来架构分层。

步骤:

第一步:修改配置文件,将UserController,UserService,UserDAO类扫描到IOC容器中。

第二步:在类中设置注解完成依赖注入。

    IOC中常用的四种注解:@Controller  @Service  @Repository  @Component

    这四种注解在效果上没有任何区别,在编码过程中可以随意使用其中的任意一个。

    但是程序员在开发过程中为了区分类,一般选择使用@Controller,@Service,@Repository分别去表示Controller层,Service层和DAO层。这也就成了一种规范。

第三步:编写测试用例,进行测试。

复制代码

<?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-4.0.xsd">

    <!-- 将类扫描到IOC容器中,这样好使用注解
            可以使用精确到包,也可以精确到类
            常用包扫描器,这样可以做到扫描包以及子包下的所有类,方便快捷    -->
    <context:component-scan base-package="com.test"/></beans>

复制代码

复制代码

 /**
  *添加注解 */
 @Controller  //Controller层的注解,表示该类作为一个控制器。
 public class UserController {
 
     @Autowired    //自动注入的注解
     private UserService userService;  
      public User getUserById(int id){         return userService.getUserById(id);
     }
 }


@Service   //Service层的注解,表示该类是业务层。public class UserServiceImpl implements UserService{

    @Autowired    private UserDAO userDAO;

    @Override    public User getUserById(int id) {        // TODO Auto-generated method stub
        return userDAO.getUserById(id);
    }

}


@Repository    //DAO层的注解,表示该类是数据接口层public class UserDAOImpl implements UserDAO{    private static Map<Integer,User> users;    static{
        users = new HashMap<Integer,User>();
        users.put(1, new User(1, "张三"));
        users.put(2, new User(2, "李四"));
        users.put(3, new User(3, "王五"));
    }

    @Override    public User getUserById(int id) {        // TODO Auto-generated method stub
        return users.get(id);
    }

}

复制代码

  注意:IOC容器自动完成装载(Autowired),默认是byType的方式。

  自动装载除了byType的方式,还可以使用byName的方式,使用byName的方式,需要结合@Qualifier注解一起使用。

例如:

复制代码

/***byName的方式,是通过属性名去匹配对应bean的id属性值
*在类中添加注解时,已经设置了默认的id,即类名首字母小写其余默认。
*
*我们也可以手动设置ID值,写法:@Service("ID值")*/@Service("myUserService")public class UserServiceImpl implements UserService{

    @Autowired    private UserDAO userDAO;

    @Override    public User getUserById(int id) {        // TODO Auto-generated method stub
        return userDAO.getUserById(id);
    }

}

@Controllerpublic class UserController {    //@Qualifier中的值必须和Service的ID值一致。    @Autowired()
    @Qualifier("userService")    private UserService userService;    public User getUserById(int id){        return userService.getUserById(id);
    }
}

复制代码

原文出处:https://www.cnblogs.com/JiangLai/p/9565646.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消