Spring深入浅出(三)XML方式以及注解的方式操作IOC
在日常的开发过程中,我们把程序分为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的更多相关文章
- 使用Spring框架入门四:基于注解的方式的AOP的使用
一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...
- Spring AOP(三)--XML方式实现
本文介绍通过XML方式实现Spring AOP,在上一篇中已经介绍了通过注解+java配置的方式,这篇文章主要是看XML中怎么配置,直接上代码了: 一.创建一个连接点 1⃣️定义接口 注意⚠️:可以定 ...
- spring中xml配置方式和注解annoation方式(包括@autowired和@resource)的区别
xml文件中配置itemSqlParameterSourceProvider是可以的: <bean id="billDbWriter" class="com.aa. ...
- spring 四种依赖注入方式以及注解注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- 复习Spring第三课--数据源配置的多种方式
spring数据源配置可以说分为:spring容器自带连接池.项目中创建连接池.服务器创建连接池三种 一.spring容器自带连接池 Spring本身也提供了一个简单的数据源实现类DriverMa ...
- Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志
一.spring aop execution表达式说明 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义 ...
- spring boot使用注解的方式引入mybatis的SqlSessionDaoSupport
出现这个问题, 说明一点, 我对spring的注解方式的配置只是知道一个皮毛. 没有深入理解. 有时间要把这部分充充电 package com.zhike.qizhi.common.dao; impo ...
- Spring第三天
Spring第三天 整体课程安排(3天+2天): 第一天:Spring框架入门.IoC控制反转的配置管理.Spring Web集成.Spring Junit集成. 第二天:Spring AOP面向切面 ...
- Spring Bean装配(下)——注解
@Repository,@Service,@Controller这三个注解是基于component定义的注解 component-scan:组件扫描 base-package:扫描这个下的所有类 &l ...
随机推荐
- redis的主从模式
主从通信过程 Master配置: 1:关闭rdb快照(备份工作交给slave) 2:可以开启aof slave配置: 1: 声明slave-of slaveof 192.168.0.102 2: 配置 ...
- T7314 yyy的巧克力(钟)
题目描述 输入输出格式 输入格式: 如图 输出格式: 如图 输入输出样例 输入样例#1: 如图 输出样例#1: 如图 说明 如图 n*m-1 我们可以这样想,1*1的巧克力一定是由1*2的掰开的 #i ...
- 配置 Windows Phone 8.1通过Fiddler代理上网
第一部分,共享笔记本无线网络 前提条件: 1)笔记本一台(双网卡(有线+无线网卡) 2)网络适配器中有2张网卡: 有线连接,名称Ethernet(必须已插上有线网络,且可以上网) 无线连接,名称Wi- ...
- PhotoZoom安装之后没有快捷方式怎么解决?
相信初次安装PhotoZoomPro的小伙伴都有这样的经历,就是软件安装完成之后桌面上并没有生成快捷方式,而且在所有程序里也找不到这个软件.这样的话,对于下次启动软件就相当困难了,甚至有些朋友为此又重 ...
- 3D立体方块旋转图册
代码可直接复制使用看效果 这个文章参考了Lazy.Cat的文章:https://www.cnblogs.com/Lazy-Cat/p/9750244.html,大家也可以去看看,他讲的还是比较详细的. ...
- idea编写Swing程序中文乱码的解决办法
Run -> Edit Configurations ,在图示位置加入-Dfile.encoding=gbk
- C文件I/O超详细教程
本文主要参考了C Primer Plus (5th & 6th Edition) 您可以选择本文的部分内容来读,有些内容对于不熟悉MS-DOS的读者可能过于晦涩难懂. C语言文件基本知识 文件 ...
- WordCount合作--自己部分
前言: (1)合作者:201631062127,201631062625 (2)合作代码地址:WordCount 一.结对的PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟 ...
- XPATH怎么获取TITLE中有中文的标签
定位 //*[@id="kkpager"]/div[1]/span[1]/a[@title="下一页"] 获取元素 txt4 = txt.xpath('//*[ ...
- THINKPHP实现搜索分页保留搜索条件
使用tp自带的分页类时,里面自带了POST查询条件保留机制,但是之针对于普通的map一维数组,如果包含like,gt等等比较复杂的查询条件则力不从心了. 带入查询条件 如果是POST方式查询,如何确保 ...