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

调用的顺序是:

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

基于xml配置方式

步骤:

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

 //Controller类
public class UserController { private UserService userService; public UserService getUserService() {
return userService;
} public void setUserService(UserService userService) {
this.userService = userService;
} public User getUserById(int id){
return userService.getUserById(id);
}
}
//Service接口
public interface UserService {
public User getUserById(int id);
}
//Service的实现类
public class UserServiceImpl implements UserService{ private UserDAO userDAO; public UserDAO getUserDAO() {
return userDAO;
} public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
} @Override
public User getUserById(int id) {
// TODO Auto-generated method stub
return userDAO.getUserById(id);
} }
//DAO接口
public interface UserDAO {
public User getUserById(int id);
} //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);
} }

  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);
}
}

Spring深入浅出(三)XML方式以及注解的方式操作IOC的更多相关文章

  1. 使用Spring框架入门四:基于注解的方式的AOP的使用

    一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...

  2. Spring AOP(三)--XML方式实现

    本文介绍通过XML方式实现Spring AOP,在上一篇中已经介绍了通过注解+java配置的方式,这篇文章主要是看XML中怎么配置,直接上代码了: 一.创建一个连接点 1⃣️定义接口 注意⚠️:可以定 ...

  3. spring中xml配置方式和注解annoation方式(包括@autowired和@resource)的区别

    xml文件中配置itemSqlParameterSourceProvider是可以的: <bean id="billDbWriter" class="com.aa. ...

  4. spring 四种依赖注入方式以及注解注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  5. 复习Spring第三课--数据源配置的多种方式

    spring数据源配置可以说分为:spring容器自带连接池.项目中创建连接池.服务器创建连接池三种 一.spring容器自带连接池   Spring本身也提供了一个简单的数据源实现类DriverMa ...

  6. Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志

    一.spring aop execution表达式说明 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义 ...

  7. spring boot使用注解的方式引入mybatis的SqlSessionDaoSupport

    出现这个问题, 说明一点, 我对spring的注解方式的配置只是知道一个皮毛. 没有深入理解. 有时间要把这部分充充电 package com.zhike.qizhi.common.dao; impo ...

  8. Spring第三天

    Spring第三天 整体课程安排(3天+2天): 第一天:Spring框架入门.IoC控制反转的配置管理.Spring Web集成.Spring Junit集成. 第二天:Spring AOP面向切面 ...

  9. Spring Bean装配(下)——注解

    @Repository,@Service,@Controller这三个注解是基于component定义的注解 component-scan:组件扫描 base-package:扫描这个下的所有类 &l ...

随机推荐

  1. POJ 3150 循环矩阵的应用

    思路: 首先 先普及一个性质: 循环矩阵*循环矩阵=循环矩阵 由于此题是距离小于d的都加上一个数. 那么 构造矩阵的时候 我们发现 诶呦 这是个循环矩阵 看看数据范围 n^2log(k)可以过. 那就 ...

  2. windows下安装reidis

    下载windows下redis安装包 https://github.com/MSOpenTech/redis/releases 这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了. 切换 ...

  3. 操作EXCEL COM组件

    操作Excel COM组件 --------------COM组件操作excel---------- 了解对象 Application:Excel运行环境,也就是excel程序 WorkBook:表示 ...

  4. redux原理

    Redux实现原理 不同组件需要依赖同一个数据的时候,就需要状态提升至这些组件的根组件. redux是状态统一管理工具,需要使用它的原因是: 组件之间通信统一管理,方便代码维护. React中有一个特 ...

  5. node.js连接数据库登录注册,修改用户(页面的ajax请求)

    首先给大家看一下目录结构,结构如下: index.html 首页(显示所有的用户信息) login.html 登录页 register.html 注册页 db.js 配置链接数据库参数 dbhelpe ...

  6. 关于app夜间模式那点事

    大半年没写过代码了 一直在忙一些其他的事情  这几天想起来看了一点  心惊肉跳的 发现好陌生  所以打算今后慢慢的拾起来  往深度和广度去发展 发现好久之前写的一个微博项目  有一个夜间模式的功能没有 ...

  7. DB2查看表空间和增加表空间容量

    Db2 connect to xxx Db2 “LIST TABLESPACES SHOW DETAIL” Tablespace ID = 7 Name = TSASNAA Type = Databa ...

  8. MFC框架下Opengl窗口闪屏问题解决方案

    转自https://blog.csdn.net/niusiqiang/article/details/43116153 虽然启用了双缓冲,但是仍然会出闪屏的情况,这是由于OpenGL自己有刷新背景的函 ...

  9. LeetCode Golang 8. 字符串转换整数 (atoi)

    8. 字符串转换整数 (atoi) 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组 ...

  10. Java根据当前日期获得昨天的当前日期代码实现

    代码: import java.text.SimpleDateFormat; import java.util.Date; /** * 根据当前日期获得昨天的当前日期 * @author jinghu ...