Java Spring IOC用法
Java Spring IOC用法
Spring IoC
轉(zhuǎn)載于:http://www.cnblogs.com/flowwind/p/4772375.html在前兩篇文章中,我們講了java web環(huán)境搭建 和java web項目搭建,現(xiàn)在看下spring ioc在java中的運用,開發(fā)工具為Intellij Idea。
1.簡介
IoC(Inversion of Control)通常稱為控制反轉(zhuǎn),是Spring框架的核心。即通過Spring容器控制對象之間的依賴關(guān)系,而不是對象自己通過new的方式去創(chuàng)建依賴的對象,相對于主動去創(chuàng)建對象,這種失去對對象的控制便叫做控制反轉(zhuǎn),控制反轉(zhuǎn)用另一種角度描述或者更好的一種理解方式來講,便是DI(Dependency Injection)依賴注入,對象只需關(guān)注業(yè)務邏輯本身即可,而不需關(guān)注依賴的對象從哪里來,交給容器注入即可,從而降低程序之間的耦合度。
2.用法
依賴注入在spring中有兩種配置方式,一是xml配置Bean的方式,二是自動裝配檢測Bean
-
2.1 xml配置Bean
- 2.1.1 創(chuàng)建Spring配置
我們在web層,web-inf/dispatcher-servlet.xml中注入service層的實現(xiàn)類,加入如下代碼
- 2.1.2 在web層controller下調(diào)用
我們在類里聲明對象,并在方法里調(diào)用,這里我們的service層接口類可以聲明為私有屬性,程序可通過@Inject自動搜索xml中的bean配置,注入依賴。
我們在屬性前加了@Inject,這里依賴javax.inject.Inject包 ,在模塊pom里加入如下依賴即可
<dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId></dependency>- 2.1.3 屬性的依賴注入
如果我們想在service層依賴注入調(diào)用dao層對象操作數(shù)據(jù)庫,則跟service層類似,我們在web層的web-inf/dispatcher-servlet.xml注入dao層的實現(xiàn),加入如下代碼
<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的實現(xiàn)類,如果是值類型或String類型可以用value指定,設定值即可,如value=5。
//聲明屬性 private DemoUserDao demoUserDao;//通過屬性的set方法,注入對象 public void setDemoUserDao(DemoUserDao demoUserDao) {this.demoUserDao=demoUserDao; }public DemoUserEntity GetDemoUser(int id) {return demoUserDao.getDemoUser(id); }
在service層,我們可以在DemoUserServiceImpl層里聲明demoUserDao私有屬性,并公開屬性set方法,然后調(diào)用- 2.1.4 構(gòu)造器注入
構(gòu)造器注入類似于屬性注入,在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層,我們創(chuàng)建構(gòu)造函數(shù)
private DemoUserDao demoUserDao; private String userName;public DemoUserServiceImpl(DemoUserDao demoUserDao,String userName) {this.demoUserDao=demoUserDao;this.userName=userName; }//在方法里既可以調(diào)用了,如下代碼public DemoUserEntity GetDemoUser(int id) {System.out.println("execute service getdemouser "+userName);return demoUserDao.getDemoUser(id); }- 2.1.5 小結(jié)
如果我們不想在xml中配置屬性注入或者構(gòu)造器注入,我們可以在聲明的屬性上,添加@Inject注解,類似2.1.2中demoUserService的實現(xiàn),這樣Spring框架會自動搜索bean對應的實現(xiàn)類,可以在bean處設置根據(jù)名稱或類型,即autowire="byType" or autowire="byName",也可以全局設置,即在根目錄beans下面聲明default-autowire="byName",具體如下。
- 2.1.1 創(chuàng)建Spring配置
-
2.2自動裝配檢測Bean
如果每個實現(xiàn)類都要配置bean元素的話,項目如果很大的情況下,太多的bean,xml文件的bean管理配置就成了一個問題,很慶幸的事,spring提供了自動裝配檢測bean注入依賴的功能。
- 2.2.1 自動檢測標注bean
我們依賴<context:component-scan>查找使用注解所標注的類,這些注解如下
@Component --通用的構(gòu)造性注解,標識該類為Spring組件
@Controller --標識將該類定義為Spring MVC Controller 這里我們用在web層
@Service --標識將該類定義為服務,這里我們用在Service層
@Repository --標識將該類定義為數(shù)據(jù)倉庫,這里我們用在Dao層具體用法如下圖示例
web層調(diào)用
@Controller
public class HelloWorldController {service層調(diào)用
@Service
public class DemoUserServiceImpl implements DemoUserService {dao層調(diào)用
@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
上一步配置好后,我們只需要聲明調(diào)用對象的屬性即可,如下
// 聲明對象 DemoUserServiceImpl實現(xiàn)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; }
web層如下service層如下
@Inject private DemoUserDao demoUserDao;public DemoUserEntity GetDemoUser(int id) {return demoUserDao.getDemoUser(id); }- 2.2.3 總結(jié)
按2.2.1和2.2.2配置操作后,即可實現(xiàn)自動檢查依賴注入bean,不用在xml中配置繁瑣的bean元素,由框架通過反射自動尋找對象實現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的Java Spring IOC用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本处理工具AWK详解
- 下一篇: Java中使用log4j记录日志