XML方式以及注解的方式操作IOC

在日常的开发过程中,我们把程序分为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     @Override
36     public User getUserById(int id) {
37         // TODO Auto-generated method stub
38         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     @Override
60     public User getUserById(int id) {
61         // TODO Auto-generated method stub
62         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);
    }

}

@Controller
public class UserController {

    //@Qualifier中的值必须和Service的ID值一致。
    @Autowired()
    @Qualifier("userService")
    private UserService userService;

    public User getUserById(int id){
        return userService.getUserById(id);
    }
}

复制代码

http://www.cgpwyj.cn/
http://news.cgpwyj.cn/
http://item.cgpwyj.cn/
http://www.peacemind.com.cn/
http://news.peacemind.com.cn/
http://item.peacemind.com.cn/
http://www.tasknet.com.cn/
http://news.tasknet.com.cn/
http://item.tasknet.com.cn/
http://www.ownbar.cn/
http://news.ownbar.cn/
http://item.ownbar.cn
http://www.shtarchao.net.cn/
http://news.shtarchao.net.cn/
http://item.shtarchao.net.cn/
http://www.metroworld.com.cn/
http://news.metroworld.com.cn/
http://item.metroworld.com.cn/
http://www.cngodo.cn/
http://news.cngodo.cn/
http://item.cngodo.cn/
http://www.gzrdbp.cn/
http://news.gzrdbp.cn/
http://item.gzrdbp.cn/
http://www.dnapt.cn/
http://news.dnapt.cn/
http://item.dnapt.cn/
http://www.ncxlk.cn/
http://news.ncxlk.cn/
http://item.ncxlk.cn/
http://www.zgxxyp.cn/
http://news.zgxxyp.cn/
http://item.zgxxyp.cn/
http://www.sjjdvr.cn/
http://news.sjjdvr.cn/
http://item.sjjdvr.cn/
http://www.sujinkeji.cn/
http://news.sujinkeji.cn/
http://item.sujinkeji.cn/
http://www.zsjxbd.cn/
http://news.zsjxbd.cn/
http://item.zsjxbd.cn/
http://www.yesgas.cn/
http://news.yesgas.cn/
http://item.yesgas.cn/
http://www.quickpass.sh.cn/
http://news.quickpass.sh.cn/
http://item.quickpass.sh.cn/
http://www.jspcrm.cn/
http://news.jspcrm.cn/
http://item.jspcrm.cn/
http://www.yjdwpt.cn/
http://news.yjdwpt.cn/
http://item.yjdwpt.cn/
http://www.henanwulian.cn/
http://news.henanwulian.cn/
http://item.henanwulian.cn/
http://www.hhrshh.cn/
http://news.hhrshh.cn/
http://item.hhrshh.cn/
http://www.gpgold.cn/
http://news.gpgold.cn/
http://item.gpgold.cn/
http://www.jingzhuiyou.cn/
http://news.jingzhuiyou.cn/
http://item.jingzhuiyou.cn/

猜你喜欢

转载自blog.csdn.net/qq_38462270/article/details/82284748
今日推荐