`
yuwenlin2008
  • 浏览: 127292 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring IOC深入学习

阅读更多

接上篇<<模拟Spring实现>>,本节来学习IOC。

在上篇的基础上,保留model,DAO,Service,我们加入Spring依赖,这里我用的Spring版本是2.6.5。spring.jar,commons-logging.jar。

1.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-2.5.xsd">

  <bean id="u" class="com.yuwl.dao.impl.UserDAOImpl">
  </bean>
	
  <bean id="userService" class="com.yuwl.service.UserService">
  	<property name="userDAO" ref="u" />
  </bean>

</beans>

 2.测试

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yuwl.model.User;

//Dependency Injection
//Inverse of Control
public class UserServiceTest {

	@Test
	public void testAdd() throws Exception {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		UserService service = (UserService)ctx.getBean("userService");
		
		User u = new User();
		u.setUsername("yuwl");
		u.setPassword("123456");
		service.add(u);
	}

}

 结果,执行成功:user saved!

说明:这里为什么使用ApplicationContext,而不用BeanFactory,根据官方文档,BeanFactory是基类,子类ApplicationContext比它做了更好的扩展,功能更强大,因此官方推荐使用ApplicationContext。

3.理解IOC

理解DI:

直接理解IOC,不太好说,先来说DI—Dependency Injection,依赖注入。

看配置文件beans.xml,userService依赖Spring容器注入userDAO,从而得到userDAO实例。

再看另一方面,userService也是通过Spring容器注入com.bjsxt.service.UserService,我们才能不用new而获得其实例,userDAO也是一样。

理解IOC:

依赖注入搞明白了,再来看IOC—Inverse of Control,控制反转,以前写程序都是我们自己new的service,自己new的dao,但是现在交给Spring容器来完成了,配下配置文件,简单又灵活就搞定了,是不是把这控制权交给了Spring,这就是控制反转。把控制权由我们人为控制交给Spring来控制。

4.注入类型

Spring提供的注入类型有三种:

a.setter(最常用)

b.构造方法(不常用)

c.接口或属性(基本不用)

我们一般用的最多的就是setter,其它两种可以不用掌握。

5.<bean中的scope属性

a.singleton单例

b.proptotype 每次创建新的对象

不写默认为singleton单例,一般配置Action的bean时,设置为proptotype。

6.自动装配

a.byName—根据bean name来自动选择

b.byType—根据bean class来自动选择

c.如果所有的bean都用同一种,可以使用beans的属性:default-autowire

byName:

<?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-2.5.xsd"
          >
  <!-- byName -->
  <bean name="userDAO" class="com.yuwl.dao.impl.UserDAOImpl">
  	<property name="daoId" value="1"></property>
  </bean>
  
  <bean name="userDAO2" class="com.yuwl.dao.impl.UserDAOImpl">
  	<property name="daoId" value="2"></property>
  </bean>
	
  <bean id="userService" class="com.yuwl.service.UserService" autowire="byName">
  </bean>

</beans>

byType:

<?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-2.5.xsd"
          >
  <!-- byType -->
  <bean name="userDAO" class="com.yuwl.dao.impl.UserDAOImpl">
  	<property name="daoId" value="1"></property>
  </bean>
  <!--  
  <bean name="userDAO2" class="com.yuwl.dao.impl.UserDAOImpl">
  	<property name="daoId" value="2"></property>
  </bean>
  -->
  <bean id="userService" class="com.yuwl.service.UserService" autowire="byType">
  </bean>

</beans>

7.Annotation第一步

修改xml文件,加入<context:annotation-config />

<?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-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	
	<context:annotation-config />
	
  	<bean id="u" class="com.yuwl.dao.impl.UserDAOImpl">
  	</bean>
  	
  	<bean id="u2" class="com.yuwl.dao.impl.UserDAOImpl">
  	</bean>
	
	<bean id="userService" class="com.yuwl.service.UserService" >
	</bean>

</beans>

8.@Autowired

a.默认按类型byType

b.如果想用byName,使用@Qulifier

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.yuwl.dao.UserDAO;
import com.yuwl.model.User;

public class UserService {
	
	private UserDAO userDAO;  
	
	public void init() {
		System.out.println("init");
	}
	
	public void add(User user) {
		userDAO.save(user);
	}
	public UserDAO getUserDAO() {
		return userDAO;
	}
	
	@Autowired
	public void setUserDAO(@Qualifier("u") UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	public void destroy() {
		System.out.println("destroy");
	}
}

9.@Resource(重要)

a.加入:j2ee/common-annotations.jar

b.默认按名称byName,名称找不到,按类型byType

c.可以指定特定名称

d.推荐使用

import javax.annotation.Resource;
import com.yuwl.dao.UserDAO;
import com.yuwl.model.User;

public class UserService {
	
	private UserDAO userDAO;  
	
	public void init() {
		System.out.println("init");
	}
	
	public void add(User user) {
		userDAO.save(user);
	}
	public UserDAO getUserDAO() {
		return userDAO;
	}
	
	@Resource
	public void setUserDAO( UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	public void destroy() {
		System.out.println("destroy");
	}
}

10.@Component @Service @Controller @Repository

a.初始化的名字默认为类名首字母小写

b.可以指定初始化bean的名字

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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:annotation-config />
	<context:component-scan base-package="com.yuwl"/>
 
</beans>

Spring容器按包结构base-package="com.yuwl"来搜索要初始化的bean

UserDAOImpl:

import org.springframework.stereotype.Component;
import com.yuwl.dao.UserDAO;
import com.yuwl.model.User;

@Component("u") 
public class UserDAOImpl implements UserDAO {

	public void save(User user) {
		//Hibernate or Jdbc add
		System.out.println("user saved!");
	}

}

UserService:

 

import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.yuwl.dao.UserDAO;
import com.yuwl.model.User;

@Component("userService")
public class UserService {
	
	private UserDAO userDAO;  
	
	public void init() {
		System.out.println("init");
	}
	
	public void add(User user) {
		userDAO.save(user);
	}
	public UserDAO getUserDAO() {
		return userDAO;
	}
	
	@Resource(name="u")
	public void setUserDAO( UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	public void destroy() {
		System.out.println("destroy");
	}
}

 

 

Spring IOC最主要的核心内容就学到这,下面将深入AOP的学习。      

0
3
分享到:
评论

相关推荐

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)...通过深入学习和理解 Spring 源码,我们可以更好地掌握这个强大的工具,并在日常开发中发挥更大的作用。

    SpringIOC经典Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建...通过学习和理解这个项目,你可以深入掌握Spring IOC的核心原理,并将其应用到自己的项目中。

    Spring IoC源码深度剖析开源架构源码2021.pdf

    文档可能将深入探讨Spring IoC容器初始化、Bean生命周期管理、依赖注入等关键概念,并以2021年的开源版本为背景进行分析。 从提供的部分文档内容来看,我们可以提炼出以下几个知识点: 1. **BeanFactory与...

    Java反射_Spring IOC

    通过阅读这本书和实践提供的JAVA+Spring示例代码,初学者可以深入理解Java反射的原理和Spring IOC的实际应用,从而提高编程技能,更好地应对复杂的项目需求。在学习过程中,务必理论与实践相结合,加深理解,这样...

    springioc的详细讲解

    Spring IOC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它将对象的创建和管理从应用程序代码中分离出来,...通过阅读提供的"Spring_IOC_.pdf"文档,你可以深入学习和掌握这些概念和技术。

    模拟spring ioc过程

    这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...

    Spring IOC源码解读

    Spring IOC,即Inversion of Control(控制反转),是Spring框架的核心特性之一,它负责管理和装配应用程序中的对象。...理解并掌握Spring的IOC源码,对于深入学习Spring框架以及提升系统设计能力具有重要意义。

    Spring-ioc-jar

    Spring IOC,全称为Inversion of Control,中文常被称为“控制反转”,是Spring框架的核心...在这个过程中,"Spring-ioc-jar"中的类和接口是实现这些功能的基础,深入研究其内部实现将有助于提升你的Spring开发技能。

    JavaEE spring IoC入门案例

    通过学习和实践这个"JavaEE spring IoC入门案例",你将能够理解并掌握如何在Spring框架下实现IoC,从而提高你的JavaEE开发能力。深入理解和运用这些知识点,可以让你在实际项目中编写出更加健壮、易维护的代码。

    模拟spring IOC非常好的事例

    下面我们将深入探讨这个"模拟spring IOC非常好的事例"所涵盖的知识点。 首先,我们需要理解什么是IOC。IOC是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身来负责。这样可以...

    spring ioc+mvc代码

    通过实际操作,我们可以更深入地理解Spring的内部机制,为后续的高级特性学习和框架优化打下坚实基础。 总结,Spring的IOC和MVC设计模式是现代Java应用开发的基石,它们极大地提高了代码的可维护性和灵活性。通过...

    spring IOC学习源码

    在本文中,我们将深入探讨Spring IOC的概念、工作原理,并通过源码分析来理解其实现方式。 首先,控制反转(IOC)是指将对象的创建和管理权限交由一个外部容器(即Spring容器)来负责,而不是由代码本身直接控制。...

    Spring核心学习IOC部分

    本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解如何构建一个类似Spring功能的系统。 首先,BeanFactory是Spring的最基本容器,它负责管理对象(也称为Bean)。BeanFactory...

    Spring IoC简单示例-注解配置-Maven构建

    在本文中,我们将深入探讨Spring框架的核心特性——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),以及如何通过注解配置和Maven项目构建来实现这一概念。Spring框架是Java...

    反射模拟springIOC.rar

    1. **配置文件解析**:在`springIOC_0602`项目中,我们有一个XML配置文件,它定义了bean的声明和它们的依赖。JDOM库被用来读取这个文件,解析bean的定义,包括bean的类名、属性、依赖等。 2. **Bean的创建**:解析...

    Spring Ioc(依赖注入)入门例子--属性注入

    让我们深入探讨一下Spring的IoC和属性注入。 IoC是设计模式中的一个概念,它改变了传统程序设计中对象之间的依赖关系创建方式。在没有IoC的情况下,对象通常会自行创建其依赖的对象实例,而IoC容器则负责管理这些...

    spring IOC容器依赖注入XML配置

    在本教程中,我们将深入探讨如何通过XML配置在Spring IOC容器中实现依赖注入。 首先,我们需要了解Spring的IOC容器。IOC容器是Spring的核心,它负责管理对象的生命周期和对象间的依赖关系。容器通过读取XML配置文件...

    spring IOC

    通过学习这些资料,开发者可以更好地理解和运用Spring的IOC特性,提高代码的可维护性和可测试性。 总结来说,Spring的IOC是通过控制反转实现对象的创建和管理,降低了组件之间的耦合度,提高了软件设计的灵活性。...

    模拟Spring的IOC

    理解并模拟Spring的IOC机制对于深入学习Spring以及提升软件设计能力具有重要意义。 **1. 控制反转(IOC)概念** 控制反转是一种设计思想,它将对象的创建和管理权交给容器,而不是由对象自身负责。这样可以降低对象...

    Spring的ioc小案例

    通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入。 Spring的IoC是它的一个关键设计模式,其核心思想是将对象的创建和管理交给容器来处理,而不是由对象自身负责。这样可以提高代码的可测试性、可...

Global site tag (gtag.js) - Google Analytics