接上篇<<模拟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的学习。
相关推荐
标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)...通过深入学习和理解 Spring 源码,我们可以更好地掌握这个强大的工具,并在日常开发中发挥更大的作用。
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建...通过学习和理解这个项目,你可以深入掌握Spring IOC的核心原理,并将其应用到自己的项目中。
文档可能将深入探讨Spring IoC容器初始化、Bean生命周期管理、依赖注入等关键概念,并以2021年的开源版本为背景进行分析。 从提供的部分文档内容来看,我们可以提炼出以下几个知识点: 1. **BeanFactory与...
通过阅读这本书和实践提供的JAVA+Spring示例代码,初学者可以深入理解Java反射的原理和Spring IOC的实际应用,从而提高编程技能,更好地应对复杂的项目需求。在学习过程中,务必理论与实践相结合,加深理解,这样...
Spring IOC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它将对象的创建和管理从应用程序代码中分离出来,...通过阅读提供的"Spring_IOC_.pdf"文档,你可以深入学习和掌握这些概念和技术。
这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...
Spring IOC,即Inversion of Control(控制反转),是Spring框架的核心特性之一,它负责管理和装配应用程序中的对象。...理解并掌握Spring的IOC源码,对于深入学习Spring框架以及提升系统设计能力具有重要意义。
Spring IOC,全称为Inversion of Control,中文常被称为“控制反转”,是Spring框架的核心...在这个过程中,"Spring-ioc-jar"中的类和接口是实现这些功能的基础,深入研究其内部实现将有助于提升你的Spring开发技能。
通过学习和实践这个"JavaEE spring IoC入门案例",你将能够理解并掌握如何在Spring框架下实现IoC,从而提高你的JavaEE开发能力。深入理解和运用这些知识点,可以让你在实际项目中编写出更加健壮、易维护的代码。
下面我们将深入探讨这个"模拟spring IOC非常好的事例"所涵盖的知识点。 首先,我们需要理解什么是IOC。IOC是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身来负责。这样可以...
通过实际操作,我们可以更深入地理解Spring的内部机制,为后续的高级特性学习和框架优化打下坚实基础。 总结,Spring的IOC和MVC设计模式是现代Java应用开发的基石,它们极大地提高了代码的可维护性和灵活性。通过...
在本文中,我们将深入探讨Spring IOC的概念、工作原理,并通过源码分析来理解其实现方式。 首先,控制反转(IOC)是指将对象的创建和管理权限交由一个外部容器(即Spring容器)来负责,而不是由代码本身直接控制。...
本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解如何构建一个类似Spring功能的系统。 首先,BeanFactory是Spring的最基本容器,它负责管理对象(也称为Bean)。BeanFactory...
在本文中,我们将深入探讨Spring框架的核心特性——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),以及如何通过注解配置和Maven项目构建来实现这一概念。Spring框架是Java...
1. **配置文件解析**:在`springIOC_0602`项目中,我们有一个XML配置文件,它定义了bean的声明和它们的依赖。JDOM库被用来读取这个文件,解析bean的定义,包括bean的类名、属性、依赖等。 2. **Bean的创建**:解析...
让我们深入探讨一下Spring的IoC和属性注入。 IoC是设计模式中的一个概念,它改变了传统程序设计中对象之间的依赖关系创建方式。在没有IoC的情况下,对象通常会自行创建其依赖的对象实例,而IoC容器则负责管理这些...
在本教程中,我们将深入探讨如何通过XML配置在Spring IOC容器中实现依赖注入。 首先,我们需要了解Spring的IOC容器。IOC容器是Spring的核心,它负责管理对象的生命周期和对象间的依赖关系。容器通过读取XML配置文件...
通过学习这些资料,开发者可以更好地理解和运用Spring的IOC特性,提高代码的可维护性和可测试性。 总结来说,Spring的IOC是通过控制反转实现对象的创建和管理,降低了组件之间的耦合度,提高了软件设计的灵活性。...
理解并模拟Spring的IOC机制对于深入学习Spring以及提升软件设计能力具有重要意义。 **1. 控制反转(IOC)概念** 控制反转是一种设计思想,它将对象的创建和管理权交给容器,而不是由对象自身负责。这样可以降低对象...
通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入。 Spring的IoC是它的一个关键设计模式,其核心思想是将对象的创建和管理交给容器来处理,而不是由对象自身负责。这样可以提高代码的可测试性、可...