Java Spring IOC用法
Java Spring IOC用法
Spring IoC
在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为Intellij Idea。
1.简介
IoC(Inversion of Control
)通常称为控制反转,是Spring框架的核心。即通过Spring容器控制对象之间的依赖关系,而不是对象自己通过new的方式去创建依赖的对象,相对于主动去创建对象,这种失去对对象的控制便叫做控制反转,控制反转用另一种角度描述或者更好的一种理解方式来讲,便是DI(Dependency Injection
)依赖注入,对象只需关注业务逻辑本身即可,而不需关注依赖的对象从哪里来,交给容器注入即可,从而降低程序之间的耦合度。
2.用法
依赖注入在spring中有两种配置方式,一是xml配置Bean的方式,二是自动装配检测Bean
2.1 xml配置Bean
- 2.1.1 创建Spring配置
我们在web层,web-inf/dispatcher-servlet.xml
中注入service层的实现类,加入如下代码
<bean id="demoUserService" class="com.ganji.demo.service.user.DemoUserServiceImpl" />
- 2.1.2 在web层controller下调用
我们在类里声明对象,并在方法里调用,这里我们的service层接口类可以声明为私有属性,程序可通过@Inject
自动搜索xml中的bean配置,注入依赖。
// 声明对象 DemoUserServiceImpl实现DemoUserService接口
@Inject
private DemoUserService demoUserService; @RequestMapping(value="/index", method = {RequestMethod.GET})
public ModelAndView index(){
DemoUserEntity demoUser=demoUserService.GetDemoUser(1);
modelAndView.addObject("demoUser", demoUser);
modelAndView.setViewName("home");
return modelAndView;
}
我们在属性前加了
@Inject
,这里依赖javax.inject.Inject
包 ,在模块pom里加入如下依赖即可<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
</dependency>
- 2.1.3 属性的依赖注入
如果我们想在
service
层依赖注入调用dao层对象操作数据库,则跟service层类似,我们在web层的web-inf/dispatcher-servlet.xml
注入dao
层的实现,加入如下代码<bean id="demoUserDao" class="com.ganji.demo.dao.gcrm.hibernate.DemoUserDaoHibernate"></bean>
<bean id="demoUserService" class="com.ganji.demo.service.user.DemoUserServiceImpl" autowire="byType">
<property name="demoUserDao" ref="demoUserDao"></property>
</bean>
ref
指像bean
的实现类,如果是值类型或String
类型可以用value
指定,设定值即可,如value=5
。
在service
层,我们可以在DemoUserServiceImpl
层里声明demoUserDao
私有属性,并公开属性set方法,然后调用//声明属性
private DemoUserDao demoUserDao; //通过属性的set方法,注入对象
public void setDemoUserDao(DemoUserDao demoUserDao)
{
this.demoUserDao=demoUserDao;
} public DemoUserEntity GetDemoUser(int id) {
return demoUserDao.getDemoUser(id);
}
- 2.1.4 构造器注入
构造器注入类似于属性注入,在xml中用
constructor-arg
来指定,这里我们在web层的web-inf/dispatcher-servlet.xml
配置如下<bean id="demoUserService" class="com.ganji.demo.service.user.DemoUserServiceImpl" autowire="byType">
<constructor-arg name="demoUserDao" ref="demoUserDao"></constructor-arg>
<constructor-arg name="userName" value="张三"></constructor-arg>
</bean>
在service层,我们创建构造函数
private DemoUserDao demoUserDao;
private String userName; public DemoUserServiceImpl(DemoUserDao demoUserDao,String userName)
{
this.demoUserDao=demoUserDao;
this.userName=userName;
} //在方法里既可以调用了,如下代码 public DemoUserEntity GetDemoUser(int id) {
System.out.println("execute service getdemouser "+userName);
return demoUserDao.getDemoUser(id);
}
- 2.1.5 小结
如果我们不想在xml中配置属性注入或者构造器注入,我们可以在声明的属性上,添加@Inject
注解,类似2.1.2中demoUserService的实现,这样Spring框架会自动搜索bean对应的实现类,可以在bean处设置根据名称或类型,即autowire="byType" or autowire="byName"
,也可以全局设置,即在根目录beans下面声明default-autowire="byName"
,具体如下。
<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"
default-autowire="byName"
>
- 2.1.1 创建Spring配置
2.2自动装配检测Bean
如果每个实现类都要配置bean元素的话,项目如果很大的情况下,太多的bean,xml文件的bean管理配置就成了一个问题,很庆幸的事,spring提供了自动装配检测bean注入依赖的功能。
- 2.2.1 自动检测标注bean
我们依赖
<context:component-scan>
查找使用注解所标注的类,这些注解如下@Component --通用的构造性注解,标识该类为Spring组件
@Controller --标识将该类定义为Spring MVC Controller 这里我们用在web层
@Service --标识将该类定义为服务,这里我们用在Service层
@Repository --标识将该类定义为数据仓库,这里我们用在Dao层具体用法如下图示例
web层调用
@Controller
public class HelloWorldController {service层调用
@Service
public class DemoUserServiceImpl implements DemoUserService {dao层调用
@Repository
public class DemoUserDaoHibernate implements DemoUserDao {注解后,我们需要在web层的
web-inf/dispatcher-servlet.xml
配置组件扫描<context:component-scan>
,分别扫描web、service。dao层,具体如下<!-- 开启controller注解支持 -->
<!-- use-default-filters="false" 只扫描指定的注解 -->
<context:component-scan base-package="com.ganji.demo.web.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan> <!--服务层自动依赖注入-->
<context:component-scan base-package="com.ganji.demo.service">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan> <!--Dao层依赖注入-->
<context:component-scan base-package="com.ganji.demo.dao">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
</context:component-scan>
同时,我们需要在xml命名空间里加入context支持,
xmlns:context="http://www.springframework.org/schema/context"
和相应的xsi具体如下<?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.xsd"
default-autowire="byName"
>
- 2.2.2 使用自动注入的bean
上一步配置好后,我们只需要声明调用对象的属性即可,如下
web层如下// 声明对象 DemoUserServiceImpl实现DemoUserService接口
@Inject
private DemoUserService demoUserService; @RequestMapping(value="/index", method = {RequestMethod.GET})
public ModelAndView index(){
DemoUserEntity demoUser=demoUserService.GetDemoUser(1);
modelAndView.addObject("demoUser", demoUser);
modelAndView.setViewName("home");
return modelAndView;
}
service层如下
@Inject
private DemoUserDao demoUserDao; public DemoUserEntity GetDemoUser(int id) {
return demoUserDao.getDemoUser(id);
}
- 2.2.3 总结
按2.2.1和2.2.2配置操作后,即可实现自动检查依赖注入bean,不用在xml中配置繁琐的bean元素,由框架通过反射自动寻找对象实现。
Java Spring IOC用法的更多相关文章
- Java Spring AOP用法
Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...
- [Java]Spring Ioc讲解,不怕你不懂
原文地址 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义 ...
- Spring IOC 概述
Spring IOC 概述 IOC(Inversion of Control) 控制反转,也叫 DI(D_ependency injection_) 依赖注入.是一种设计思想.不过我并不同意所谓反转的 ...
- Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式
java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的 ...
- Spring IOC之基于JAVA的配置
基础内容:@Bean 和 @Configuration 在Spring中新的支持java配置的核心组件是 @Configuration注解的类和@Bean注解的方法. @Bean注解被用于表明一个方法 ...
- J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP
J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言 搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理. ...
- Java Spring Boot VS .NetCore (三)Ioc容器处理
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- Spring IOC知识java反射
[1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...
- 【小家Spring】Spring IoC是如何使用BeanWrapper和Java内省结合起来给Bean属性赋值的
#### 每篇一句 > 具备了技术深度,遇到问题可以快速定位并从根本上解决.有了技术深度之后,学习其它技术可以更快,再深入其它技术也就不会害怕 #### 相关阅读 [[小家Spring]聊聊Sp ...
随机推荐
- 循环结构——whlie do whlie for for each
1. while循环 while(循环条件){ (特点为:先判断再执行) 循环操作 } 例题: 计算1+2+3+...+100 int i = 1; int sum = 0; wh ...
- updateEasyuiTab
//tabContainer:easyui-tabs或者id,title名称 this.updateEasyuiTab = function (tabContainer, outTitle, outU ...
- base64/62 加解密的实现。
base64/62加解密代码下载地址: http://files.cnblogs.com/files/Kingfans/base64(62)加解密.zip base64: base62:
- 数据仓储之DLL层接口设计
一.接口设计 1.1. IBaseRepository.cs public interface IBaseRepository<T> { T Add(T entity); bool Upd ...
- 浅谈SDN和NFV之间的关系
一个行业固定设备的折旧周期很长,任何变革的发生都绝非易事,但是网络却一次性面临两项革新--软件定义网络(SDN)和网络功能虚拟化(NFV),在变革网络的过程中,二者若想取得成功可能会依赖彼此的技术,或 ...
- 主机使用代理上网,虚拟机Linux如何连外网
VMware虚拟机的三种联网方法及原理 一.Brigde--桥接 :默认使用VMnet0 1.原理: Bridge 桥"就是一个主机,这个机器拥有两块网卡,分别处于两个局域网中,同时在& ...
- pycharm 下载与配置
https://www.jetbrains.com/pycharm/download/
- winform初学
一.建立winform工程项目
- SharePoint 2013开发入门探索(二)- 列表操作
我们如何用代码对SharePoint列表做些例如增删改查的操作呢?如果您的程序可以部署到服务器上,就可以使用 服务器对象模型,因为服务器对象模型提供的功能最多,限制最少:否则可能要选择客户对象模型等其 ...
- JS新手易错点
写给自己 字符串换行不能直接换行,需要在行尾加换行符"\" var a = "aa bb" 是不行的 需要改成 var a="aa\ bb"