`
yuwenlin2008
  • 浏览: 124726 次
  • 性别: 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
分享到:
评论

相关推荐

    spring4讲义-第二章spring与IoC

    动力节点老郭讲spring,通俗易懂,深入浅出,是学习spring的必备教程。

    深入理解java的spring-ioc的使用

    主要介绍了java的spring-ioc的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Spring--IOC学习资料(pdf)

    帮助初学者深入理解Spring的好资料

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    第二部分深入阐述了各种基于IoC容器和AOP的JavaEE组件在Spring和的实现原理,第三部分讲述了ACEGI安全框架、DM模块以及Flex模块等基于Spring的典型应用的设计与实现。无论你是Java程序员、Spring开发者,还是平台...

    深入解析SPRING架构与设计原理-第二版

    高级开发必须掌握的知识点,学完后会对这一块的技术有系统化的认知,对于Spring IOC和AOP的讲解看这一本就够了。推荐下载和学习我上传的资料,都是清晰版本。《深入理解Java虚拟机 JVM高级特性与最佳实践 第2版 .pdf...

    Spring中IOC和AOP的深入讲解

    主要给大家介绍了关于Spring中IOC和AOP的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    spring2.0技术手册

    《Spring 2.0技术手册》内容全面深入,主要包括Spring入门、Bean/消息/事件、Spring AOP、JDBC/事物支持、Spring与Hibernate的整合、Spring Web MVC框架、View层方案/Web框架整合、API封装、Spring在线书签完整...

    SPRING攻略 第2版.pdf

    构建于Spring IoC容器组件模型之上的这些Spring3部件提供了集成、批处理、OSGi、Ajax和Flex集成、状态式的Web应用、REST风格Web服务、富客户端用户界面、Google AppEngine开发、基于云的部署、消息、数据访问、Web...

    Spring框架控制反转IOC和依赖注入DI详解

    Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring框架使用(IoC)六.注入类型的三种方式 一.入门程序和IOC简介 依赖注入或控制反转的定义...

    tiny-spring-practice:实践tiny-spring,手写Spring两大核心功能:IOC和AOP

    最近想深入学习一下Spring的两大核心功能:IOC、AOP。想看源码但是Spring的源码层次复杂,封装繁琐,简单的逻辑写的非常“啰嗦”,阅读起来很费劲。然后发现了多年前的一个精简版的Spring学习项目,叫,作者对spring...

    Spring+3.x企业应用开发实战光盘源码(全)

     第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架的三个最重要的框架级接口进行了剖析,并对Bean的生命周期进行讲解。  第4章:讲解如何在Spring配置文件中使用Spring 3.0...

    javaSpring学习笔记

    在“Java Spring学习笔记”中,你将找到对Spring框架的全面介绍,包括IoC(控制反转)和DI(依赖注入)原理、AOP(面向切面编程)、Spring MVC、Spring Boot等核心内容。每个主题都结合了理论知识和实际示例,帮助你...

    SPRING攻略 第2版 (带书签)(二)

    构建于Spring IoC容器组件模型之上的这些Spring3部件提供了集成、批处理、OSGi、Ajax和Flex集成、状态式的Web应用、REST风格Web服务、富客户端用户界面、Google AppEngine开发、基于云的部署、消息、数据访问、Web...

    Spring2.0技术手册

    本书介绍了Spring 2.0的新特性,诸如Spring 2.0的新配置、新AOP支持、增强的IoC、JDBC和form标签等新功能。它通过实际完成一个完整的Spring项目示例,展示了与Spring相关API的使用技巧,能够显著减少每一位入门者...

    Spring攻略(第二版)高清版

    构建于Spring IoC容器组件模型之上的这些Spring3部件提供了集成、批处理、OSGi、Ajax和Flex集成、状态式的Web应用、REST风格Web服务、富客户端用户界面、Google AppEngine开发、基于云的部署、消息、数据访问、Web...

    Spring攻略 英文第二版

    构建于Spring IoC容器组件模型之上的这些Spring3部件提供了集成、批处理、OSGi、Ajax和Flex集成、状态式的Web应用、REST风格Web服务、富客户端用户界面、Google AppEngine开发、基于云的部署、消息、数据访问、Web...

    深入解析Java Spring框架

    我们将深入研究Spring的核心组件,如IoC容器、AOP模块、数据访问层、Web模块等,揭示其在应用开发中的关键作用。 二、个人心得体会 2.1 初识Spring的感受 分享我初次接触Spring的经历,包括遇到的挑战和对框架的第...

    spring基础进阶技巧200篇.zip

    《Spring基础进阶技巧200篇》是一本关于Spring框架的资源,它提供了200篇文章,涵盖了Spring框架的基础知识和...这本资源适合已经具备一定Spring基础知识的开发人员,希望进一步深入学习和应用Spring框架的技术人员。

    SPRING攻略 第2版 (带书签)(一)

    构建于Spring IoC容器组件模型之上的这些Spring3部件提供了集成、批处理、OSGi、Ajax和Flex集成、状态式的Web应用、REST风格Web服务、富客户端用户界面、Google AppEngine开发、基于云的部署、消息、数据访问、Web...

Global site tag (gtag.js) - Google Analytics