Spring学习笔记二之IOC(xml实现)

原创 2013年12月04日 18:14:09

今天正式开始学习Spring,Spring主要分为两大块,一个是IOC,一个是AOP,IOC相对于AOP来说比较简单,所以先从IOC学起,实现IOC分为两种方式,一中是通过配置文件,另外一种是通过注解的方式,接下来先用配置文件来实现:

一.Bean的注入类型(三种方式):

1.      通过setter注入:

这种注入方式是最常用的一种,先要在service层中提供dao层的set和get方法:

package com.limitvic.service;

import com.limitvic.dao.UserDao;
import com.limitvic.dao.impl.UserDaoImpl;
import com.limitvic.domain.User;
public class UserService {
	private UserDao userDao;
	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	public void add(User user) throws Exception{
		userDao.save(user);
	}
}

beans.xml中:

<?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">
<bean id="u" class="com.limitvic.dao.impl.UserDaoImpl">
</bean>
<bean id="userService" class="com.limitvic.service.UserService">
     <property name="userDao" ref="u"/>
</bean>
</beans>

2.  通过构造方法注入:

service层中写一个构造函数:

package com.limitvic.service;

import com.limitvic.dao.UserDao;
import com.limitvic.dao.impl.UserDaoImpl;
import com.limitvic.domain.User;
public class UserService {
	private UserDao userDao;
    
	public  UserService(UserDao userDao){
		
		this.userDao = userDao;
	}
	public void add(User user) throws Exception{
		userDao.save(user);
	}
}

beans.xml

<?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">
<bean id="u" class="com.limitvic.dao.impl.UserDaoImpl">
</bean>
<bean id="userService" class="com.limitvic.service.UserService">
    <constructor-arg>
    <ref bean="u"/>
    </constructor-arg>
</bean>
</beans>

3.  接口方法注入:

接口注入很少用到,而且还会增加代码量,所以在这里就不介绍了。

 

二.简单属性注入:

如何在实现dao的dao.impl中存在属性,可以再beans.xml中直接进行值得注入:

package com.limitvic.dao.impl;

import com.limitvic.dao.UserDao;
import com.limitvic.domain.User;

public class UserDaoImpl implements UserDao{
    private  int test1;
    private  String test2;
    
	public int getTest1() {
		return test1;
	}

	public void setTest1(int test1) {
		this.test1 = test1;
	}

	public String getTest2() {
		return test2;
	}

	public void setTest2(String test2) {
		this.test2 = test2;
	}

	@Override
	public void save(User user) {
		// TODO Auto-generated method stub
		System.out.println("已保存"+user.getUsername()+"的用户信息");
		System.out.println("test1="+test1);
		System.out.println("test2="+test2);
	}
    
}

可以在beans.xml中这样子写:

<?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">
<bean id="u" class="com.limitvic.dao.impl.UserDaoImpl">
<property name="test1" value="8"></property>
<property name="test2" value="test2"></property>
</bean>
<bean name="userService" class="com.limitvic.service.UserService">
    <constructor-arg>
    <ref bean="u"/>
    </constructor-arg>
</bean>
</beans>

这样子就可以把值直接注入给test1 和test2了。

 

三.Bean 的范围属性Scope:

其中singleton和prototype较为常用,一个是指单例,另一个指的是原型,而剩下的三个一般在Spring 和其他框架相结合时才会用到,先来看看Scope这个属性到底是做什么用的,Spring中默认的是singleton。

所以可以写这样的代码:

UserServiceuserService = (UserService)factory.getBean("userService");

UserServiceuserService2 = (UserService)factory.getBean("userService");

这样子获得的两个UserService的对象其实是同一个,因为系统内部创建对象时是用单例模式。

但如果在beans.xml中这样子该:

<bean name="userService"class="com.limitvic.service.UserService" scope="prototype">

那么获得这两个UserService 对象才是不一样的,每次创建对象时创造一个新的。

四.自动装配:

这里要用到一个属性叫做autowire, 在bean中一般这样子赋值:

autowire = “byName”或者 autowire = “byType” 再或者autowire = “default”

分别是按照名字自动匹配,按照类型自动匹配,或者按照默认值自动匹配。

这里举个例子:

在beans.xml中:

<?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">
<bean id="userDao1" class="com.limitvic.dao.impl.UserDaoImpl">
<property name="id" value="1"></property>
</bean>

<bean id="userDao2" class="com.limitvic.dao.impl.UserDaoImpl">
<property name="id" value="2"></property>
</bean>

<bean name="userService" class="com.limitvic.service.UserService" autowire="byName">
</bean>
</beans>

service层中:

package com.limitvic.service;

import com.limitvic.dao.UserDao;
import com.limitvic.dao.impl.UserDaoImpl;
import com.limitvic.domain.User;
public class UserService {
	private UserDao userDao1;
    
	public void add(User user) throws Exception{
		userDao1.save(user);
	}
	public UserDao getUserDao() {
		return userDao1;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao1 = userDao;
	}
	
}

通过autowire这个属性,可以把bean中的userDao1userDao2自动和service中的userDao1属性进行比对,如果比对成功,可知userDao1比对成功,就将bean中的userDao1注入给service中的userDao1

如果所有的bean都用同一种装配方式:可以在beans.xml开头写上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
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byName"


Spring中IOC配置xml实现和IOC注解实现

1.什么是spring spring 是分层的JavaSE/EE轻量级应用开源框架,已控制反转IOC和面向切面编程AOP为核心,提供了展现层SpringMVC, 和持久层Srping JDBC以及事务...
  • u014292162
  • u014292162
  • 2016年08月22日 16:10
  • 3283

Spring IOC 依赖注入的两种方式XML和注解

依赖注入的原理 依赖注入的方式---XML配置 依赖注入的方式---注解的方式 Spring 它的核心就是IOC和AOP。而IOC中实现Bean注入的实现方式之一就是DI(依赖注入)。 ...
  • hechurui
  • hechurui
  • 2015年07月29日 22:18
  • 1628

Spring(一)Spring IOC容器配置详解——基于xml文件形式

一、Spring         Spring是一个轻量级的框架,相当于一个平台性质,大大简化了Java企业级应用的开发,提供了强大的、稳定的功能。Spring框架大约由20个功能模块组成,这些模块被...
  • qq_16313365
  • qq_16313365
  • 2015年01月24日 20:19
  • 1645

Spring(三):IoC容器装配Bean(xml配置方式和注解方式)

XML配置方式 一、三种实例化Bean的方式 1.使用类构造器实例化(默认无参数) 2.使用静态工厂方法实例化         class="com.itcast.factory.Pe...
  • u013360022
  • u013360022
  • 2016年07月05日 00:28
  • 1653

Spring学习总结——Spring实现IoC的多种方式

目录 一、使用XML配置的方式实现IOC二、使用Spring注解配置IOC三、自动装配四、零配置实现IOC五、示例下载 控制反转IoC(Inversion of Control),是一种设计思想,...
  • u010987379
  • u010987379
  • 2016年08月08日 16:10
  • 2054

Spring Ioc实现机制——简析

需要明确一点,任何项目没有了Spring,也依旧能做,那么为什么Spring还会这么火?答案就是Spring的两个特性IoC与AOP,这里需要指出的是,并不是Spring提出的AOP的概念,只能说是S...
  • Anger_Coder
  • Anger_Coder
  • 2013年10月14日 13:52
  • 4111

SpringIOC容器的实现(简述)

Spring的IOC和DI实际上说的是同一件事情。 IOC:(Inversion of Control)控制反转,简单的将就是将原始类A使用类B时需要在类A中创建B的操作,交给第三方(容器),将...
  • moudaen
  • moudaen
  • 2014年06月04日 11:00
  • 924

Spring如何实现IOC与AOP的

1、Spring IOC     IoC 与 DI    首先想说说 IoC ( Inversion of Control ,控制倒转)。这是 spring 的核心,贯穿始终。所谓 IoC ,对于 s...
  • u013380777
  • u013380777
  • 2016年05月18日 11:04
  • 1510

spring中的Ioc技术是怎样实现解耦的

http://tieba.baidu.com/p/3214161390 1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此...
  • liang5603
  • liang5603
  • 2016年07月23日 10:44
  • 1908

写一个自己的Spring框架——简单实现IoC容器功能

学习过Spring的同学都知道,Spring框架的核心就是IoC和AOP。Spring可以理解为一个工厂,负责对象的创建和对象间关系的维护。IoC即控制反转,简单点说就是原来的对象是在要使用之前通过在...
  • u010994169
  • u010994169
  • 2017年05月04日 14:09
  • 1848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring学习笔记二之IOC(xml实现)
举报原因:
原因补充:

(最多只允许输入30个字)