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 ...
随机推荐
- ORACLE RAC 11G 添加以及删除UNDO表空间
在生产环境上,由于闪存盘的容量有限,现在需要将闪存盘里面的UNDO表空间,替换到非闪存的磁盘里面. 磁盘的使用情况如下: 表空间使用情况如下: RAC两个节点占用将近167G的空间. 操作步骤如下: ...
- 几种AutoLayout自动布局所经常使用的布局约束类型
width表示约束ui控件的固定宽度 height表示约束ui控件的固定高度 Leading Space to Superview 与父视图的左边界线保持固定距离 Trailing Space to ...
- ubuntu下谷歌浏览器字体模糊解决方案
一般来说,这种问题应该是缺少字体造成的,因此重新安装字体就可以解决问题. 1.双系统下,查找Windows C盘下:Windows/font/???? ???可在3中查找相应字体 2.分别双击安装那两 ...
- Kafka.net使用编程入门
最近研究分布式消息队列,分享下! 首先zookeeper 和 kafka 压缩包 解压 并配置好! 我本机zookeeper环境配置如下: D:\Worksoftware\ApacheZookeep ...
- 动画view
1:view动画 @1:xml中 alph:渐变透明度动画效果 scale:渐变尺寸伸缩动画效果 translate:画面转换位置移动动画效果 rootate:画面转移旋转动画效果 @2:JavaCo ...
- APUE学习笔记7——进程间通信
1 管道 管道一般是一种半双工的进程间通信方式,只能够在具有公共祖先的进程之间使用,比如一个管道由一个进程创建,然后该进程调用fork,之后父.子进程就可以使用该管道. 管道是调用pipe函数创建的. ...
- Front End Developer Questions
Front End Developer Questions 感谢大神分享- 目录 前言 HTML部分 CSS部分 JavaScript部分 其他问题 前端学习网站推荐 前言 前言 HTML Docty ...
- ABBYY FineReader双十一优惠享不停,战绩如何?
随着双十一的火热来袭,购物达人也是不吝啬囊中票子,各种姿势剁手齐全,立誓过后吃土半月,双十一的好与不好?自己也是门清,反正真真的是促进消费了! 就ABBYYFineReader而言,此次的双十一力度就 ...
- jq——css类
1 addClass(classname) 添加类 <script type="text/javascript"> $("input").clic ...
- luogu p1003
P1003 题意 经过多个矩形(1e3)覆盖后后某个坐标属于那个矩形(仅仅是一次询问) 大水题,直接的做法,从后向前处理矩形是否覆盖查询的点,若覆盖,则是该矩形编号 题解 int get_num(){ ...