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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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 Ioc讲解,不怕你不懂
引述 :IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能 ...
- java Spring IOC
原文地址 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义 ...
- java spring ioc 实例_Spring 源码阅读(IOC容器)-bean的实例化以及注入
3.Bean的实例化以及注入过程分析 Bean的实例以及注入是在getBean时触发的,由于外部容器是与外部调用交互的桥梁,我们首先从外部容器入手,AbstractApplicationContext ...
- Spring AOP用法
软件152 杨浩艺 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制反转),另外一个 ...
- java中extends用法_JAVA的extends用法
理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...
- Spring基本用法1——Spring的核心机制:IOC、DI
前言:一直想写一个关于Spring的系列文章,但是构思许久却不知道以什么方式阐述,毕竟要把一个复杂框架说清楚并不是那么容易的,我也只能尽力而为了.Spring系列文章打算以这样的顺序展 ...
- java bean参数清空_Java互联网架构-Spring IOC底层源码分析
欢迎关注头条号:java小马哥 周一至周日早九点半!下午三点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 spring ioc是spring的核心之一,也是spring体系的基础,那 ...
- spring ioc原理_干了5年的Java面试官,把他喜欢问的几十个Spring面试题告诉我了
前言: Spring 框架知识是互联网公司面试必考知识点.对于开发同学来说,Spring 框架熟悉又陌生. 熟悉:开发过程中无时无刻不在使用 Spring 的知识点:陌生:对于基本理论知识疏于整理与记 ...
- java spring server_Java server框架之(1):spring中的IoC
为什么需要IoC? 一般的对象耦合是在编译时确定的,也就是说当我们写如下类: 1 public classStaticCoupling { 2 3 String s = new String(&quo ...
最新文章
- opencv下指定文件夹下的图片灰度化(图片的读取与保存)-------简单记录
- (二十三)原型模式详解(clone方法源码的简单剖析)
- ERP实施过程中的十个“拦路虎”
- wxWidgets:wxTextCtrl类用法
- 微信小程序————经纬度转化为具体位置(逆地址解析)
- Git之深入解析如何使用Git调试项目源码中的问题
- scala中使用特质中的抽象字段和实际字段
- 推荐一款ORM工具 FOR ADOBE AIR
- Idea 工具在java文件中怎么避免 import .*包
- 3分钟看懂 Linux 磁盘划分
- Druid手动创建连接的坑
- 图吧工具箱2021最纯净的电脑硬件工具箱
- 绝对靠谱安全的论文免费安全查重检测重复率网站
- goeasy服务器发送(发布)消息,微信小程序中怎么使用GoEasy实现实时通讯
- 苹果微信换行怎么打_苹果手机微信怎么加密,教你几招快速加密
- UE5 虚幻引擎学习资源汇总
- 【数据压缩】C语言实现bmp图片序列生成yuv视频
- 基础攻防实验-DVWA-秋潮-网络配置
- 查看Java元空间区域
- 2-1:编写一个Java应用程序,输出俄文字母表。
热门文章
- java object... arguments_Java面试之基础题---对象Object
- java web容器原理_javaWeb工作原理
- Ubuntu将python2.7默认更改为python3.X版本
- 工业交换机的定义和应用
- [渝粤教育] 西安工业大学 园中画境 中国古典园林造园艺术 参考 资料
- 【渝粤题库】陕西师范大学200401 初等代数研究 作业(专升本)
- 【渝粤题库】陕西师范大学200751 《操作系统》作业
- 通信原理速学02:随机过程
- oracle java 并发_【转】JAVA并发教程(ORACLE官网资料)
- C语言去括号编程题,去括号 - C语言网