• 1. IOC(控制反转)
  • 2. 基本原理 - 容器和bean 在Spring中,那些组成你应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
  • 3. 容器
  • 4. Spring的IOC容器-BeanFactoryorg.springframework.beans.factory.BeanFactory 是Spring IoC容器的实际代表者,IoC容器负责容纳此前所描述的bean,并对bean进行管理。 在Spring中,BeanFactory是IoC容器的核心接口。 它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
  • 5. Spring的IOC容器-ApplicationContext context包的核心是ApplicationContext接口。它由BeanFactory接口派生而来,因而提供了BeanFactory所有的功能。 多数用户可以采用声明的方式来使用ApplicationContext,甚至不用手动创建它,而通过ContextLoader这样的支持类,把它作为J2EE web应用的一部分自动启动。
  • 6. 实例化容器 使用BeanFactory 使用ApplicationContext
  • 7.  BeanFactory 还是 ApplicationContext? BeanFactory总是延迟加载Bean,直到第一次调用getBean(“beanId”)方法请求Bean的实例时,BeanFactory才会创建这个Bean。 ApplicationContext在自身初始化时就一次性创建了所有的Bean。绝大多数时候,ApplicationContext是最佳的选择。
  • 8. 配置元数据Spring IoC容器将读取配置元数据; 并通过它对应用中各个对象进行实例化、配置以及组装。 通常情况下我们使用简单直观 的XML来作为配置元数据的描述格式。 bean定义与应用程序中实际使用的对象一一对应。通常情况下bean的定义包括:服务层对象、数据访问层对象(DAO)、类似Struts Action的 表示层对象、Hibernate SessionFactory对象等。
  • 9. XML配置文件分拆成多个部分
  • 10. Bean的定义class:实例化bean name:bean的命名 scope:bean的作用域 constructor arguments:构造器依赖注入 properties:属性依赖注入 autowiring mode:自动装配(autowire )协作者
  • 11. Bean的命名 每个bean都有一个或多个id(或称之为标识符或名称,在术语 上可以理解成一回事)。这些id在当前IoC容器中必须唯一。如果 一个bean有多个id,那么其他的id在本质上将被认为是别名。
  • 12. 实例化bean 从本质上来说,bean定义描述了如何创建一个或多个对象实例。 当采用XML描述配置元数据时,将通过元素的 class属性来指定实例化对象的类型。
  • 13. Bean的作用域Bean的作用域定义了Bean的生命周期。 Spring2.0种定义了五种作用域,分别是singleton、prototype、request、session和globalSession。其中后三种对Web应用程序有效。
  • 14. Singleton作用域如果不指定scope,默认值即为scope=“singleton” 每个Bean有且仅有一个实例
  • 15. Prototype作用域每次返回Bean的新实例 通常情况下,DAO不会被配置成prototype,因为DAO通常不会持有任何会话状态,因此应该使用singleton作用域。
  • 16. DI(依赖注入)DI的全称Dependency Injection 依赖注入解决了最主要的一个问题:将组件的配置与使用相分离,并且由IOC容器负责管理组件的生命周期。 DI主要有两种注入方式 :Setter注入和构造器注入
  • 17. 设置属性注入(setter方法)注入基本类型 注入引用类型 注入List类型和数组类型 注入Set类型 注入Map类型
  • 18. 注入基本类型BasicBean.xml
  • 19. config.xml
  • 20. Main.java
  • 21. 注入依赖对象RefBean.java
  • 22. config.xml
  • 23. 注入List类型和数组类型ListBean.java
  • 24. config.xml
  • 25. 注入Map类型MapBean.java
  • 26. config.xml
  • 27. Main.java
  • 28. 构造方法注入ConstrutorBean.java config.xml
  • 29. 手工装配or自动装配注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。 1.手工装配依赖对象 2.自动装配依赖对象
  • 30. 手工装配手工装配依赖对象,在这种方式中又有两种编程方式 1. 在xml配置文件中,通过在bean节点下配置,如 //构造器注入 //属性setter方法注入 2. 在java代码中使用@Autowired或@Resource注解方式进行装配。 但我们需要在xml配置文件中配置以下信息: 注: @Resource注解在spring安装目录的lib\j2ee\common-annotations.jar
  • 31. 手工装配在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是: @Autowired 默认按类型装配。 @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
  • 32. 手工装配 @Autowired private PersonDao personDao;//用于字段上 @Autowired public void setOrderDao(OrderDao orderDao) {//用于属性的setter方法上 this.orderDao = orderDao; } @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: @Autowired @Qualifier("personDaoBean") private PersonDao personDao;
  • 33. 手工装配 @Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。 @Resource(name=“personDaoBean”) private PersonDao personDao;//用于字段上 注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
  • 34. 自动装配(autowire)协作者 Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。
  • 35. 自动装配(autowire)协作者 自动装配示例: 修改为
  • 36. 通过在classpath自动扫描方式把组件纳入spring容器中管理前面的例子我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个 组件,如果这些这组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起 来也不太方便。spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了 @Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring 容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。 要使用自动扫描机制,我们需要打开以下配置信息: 其中base-package为需要扫描的包(含子包)。 @Service用于标注业务层组件、 @Controller用于标注控制层组件(如struts中的action)、@Repository用于标注数据访问组件,即DAO组件。而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。