在日常的开发过程中,我们把程序分为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. 编译安装FFmpeg 要支持xvid、x264、mp3、ogg、amr、faac

    编译安装FFmpeg 要支持xvid.x264.mp3.ogg.amr.faac libfaac    faac格式的编解码包libmp3lame    mp3格式编解码包libopencore-am ...

  2. layer.js漂亮的弹出框

    它的官方网站:http://layer.layui.com/ 消息.确认框.ifame.自定义文本.旋转木马,都有按钮,是一款强大的js 弹出框: 以下为本人的简单介绍: layer.open({ t ...

  3. jQuery对象与DOM对象的区别

    如何判断一个js对象是否一个DOM对象 我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法. 要判断一个对象是否D ...

  4. Android 制作类似支付圆圈和打钩界面ProgressWheel

    首先要说明的是,制作圆圈旋转的效果并不是博主做的,是参照了github上的一个代码,只是在上面添加了修改,对其优化并增加了一个打钩的动画. 先来看下效果,1+的手机获取root权限真是难,没法录屏,只 ...

  5. spring mvc 项目 相关配置文件小结

    web.xml文件主要配置如下: 需要加载的配置文件: 类路径下,可以使用通配符配置  类似:classpath:conf/spring/*/*.xml, <context-param> ...

  6. Markdown标记语言

    Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber).它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”.这种语言吸收了很 ...

  7. 哪里获取ZBrush简体中文版?

    ZBrush®精简版(ZBrush简体中文版)ZBrushCore发布已经有一段日子了,相信不少人早已迫不及待地开始尝试了,不知道你们的体验如何?毋庸置疑的是,ZBrushCore专为刚接触3D并希望 ...

  8. mac 调整Launchpad行列数目

    Mac调整Launchpad  行数和列数 开打Terminal终端依次输入以下三句: <1> 改变行数:defaults write com.apple.dock springboard ...

  9. Codeforces Round #499 (Div. 2) F. Mars rover_dfs_位运算

    题解: 首先,我们可以用 dfsdfsdfs 在 O(n)O(n)O(n) 的时间复杂度求出初始状态每个点的权值. 不难发现,一个叶子节点权值的取反会导致根节点的权值取反当且仅当从该叶子节点到根节点这 ...

  10. python的父类和子类中关于继承的不同版本的写法

    Python 2.7中的继承 在Python 2.7中,继承语法稍有不同,ElectricCar 类的定义类似于下面这样: class Car(object): def __init__(self, ...