spring之IOC学习笔记

我不是女神ヾ 2022-01-23 14:17 352阅读 0赞

一、IOC(控制反转)

软件开发原则:高内聚,低耦合。

有一个A功能需要实现

高内聚:现在在一个B类中就能完成A功能,现在B类就是内聚

低耦合:现在需要C类和D类一起才能完成A功能,现在C类和D类就是耦合的(通俗的来讲就是C类和D类存在依赖关系)

在软件开发中我们需要,尽量降低耦合度,提高内聚。

====================================================================

例:

20190604100248414.png

现在A类是依赖于B类的,当B类作出了修改,那么A类也会修改。在软件开发中要尽量减少这样的耦合度。

spring为我们提供的解决方案:xml+dom4j+反射+工厂

1.xml中配置类的完全限定名

2.dom4j解析xml

3.工厂中反射创建对象

新建一个maven项目,导入jar包:

  1. <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-context</artifactId>
  5. <version>5.1.1.RELEASE</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-test</artifactId>
  11. <version>5.1.1.RELEASE</version>
  12. <scope>test</scope>
  13. </dependency>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.12</version>
  18. </dependency>
  1. 属性注入即setter注入:
  2. 构造方法注入:
  3. 注解注入@autowired

1.新建一个类用于测试依赖注入:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70

2.在resources文件夹下面新建一个spring的xml配置文件

注入方式一:常规方式

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 1

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="user" class="cn.mesmile.test.User">
  7. </bean>
  8. </beans>

3.写一个测试类,测试依赖注入

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 3 watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 4

解释:都是接口,Applicationcontext是BeanFactory的子接口,拥有更多的功能与方法
重点:Applicationcontext是在启动容器创建上下文环境的时候就创建 Bean对象(预先加载,迫切加载),而 BeanFactory是在使用的时候才进行对象的创建(懒加载)———————————->**
在单例模式的时候有效**

在单例模式下:

Applicationcontext是在启动容器创建上下文环境的时候就创建 Bean对象(预先加载)

BeanFactory是在使用的时候才进行对象的创建Bean对象(懒加载)

1.单个Bean对象懒加载

20190604120941382.png

配置懒加载后,applicationContext对于这个对象就不是预先加载了。

2.spring中所有bean对象全部懒加【配置文件的根对象中添加efault-lazy-init为true】

20190604121406529.png

注入方式二:静态工厂注入

20190604111051779.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 5 方式三:实例工厂注入

20190604111803494.png

修改spring配置文件

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 6

方式四:配置类的初始化方法,和销毁方法

20190604113620100.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 7watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 8

方式五:构造方法注入 (创建对象的同时,赋值)

20190604122653812.png

修改配置spring文件:

2019060412333132.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 9

方式六:构造方法中传入的参数是对象

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 10

20190604125129987.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 11

方式七:setter方法注入

20190604131258871.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 12

===============================================================

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 13

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 14

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 15

BeanFatory:用于创建我们在xml中不能直接配置的对象

新建一个类:

  1. public class MyEntityManagerFactory {
  2. // 假设我们需要得到这个类的对象,但是不能够在xml中直接配置
  3. }

新建一个类:

  1. public class MyPersist {
  2. // 这个类中的这个方法,用于返回获得我们需要获得的对象
  3. public static MyEntityManagerFactory creteMyEntityManagerFactory(){
  4. return new MyEntityManagerFactory();
  5. }
  6. }

新建一个类,实现BeanFactory接口:

  1. /**
  2. *
  3. * 这个类实现FactoryBane这个类,并且传入需要返回的类
  4. */
  5. public class MyFactoryBean implements FactoryBean<MyEntityManagerFactory>{
  6. /**
  7. * @return 返回需要返回的对象
  8. * @throws Exception
  9. */
  10. @Override
  11. public MyEntityManagerFactory getObject() throws Exception {
  12. return MyPersist.creteMyEntityManagerFactory();
  13. }
  14. /**
  15. * @return 返回的对象是什么类型
  16. */
  17. @Override
  18. public Class<?> getObjectType() {
  19. return MyEntityManagerFactory.class;
  20. }
  21. /**
  22. * @return 返回的对象是否是单例
  23. */
  24. @Override
  25. public boolean isSingleton() {
  26. return false;
  27. }
  28. }

在resources文件夹下新建一个spring配置文件:springContext-factory.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd"
  6. >
  7. <!--
  8. 会调用 FactoryBean 的getObject方法,返回我们需要的对象
  9. -->
  10. <bean id="factory" class="cn.mesmile.factory.MyFactoryBean">
  11. </bean>
  12. </beans>

测试:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 16

二、spring中bean的作用域

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 17

默认的配置中 scope=“singleton” ,单例的对象存在线程安全问题。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 18

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cHJlemhlbmc_size_16_color_FFFFFF_t_70 19

发表评论

表情:
评论列表 (有 0 条评论,352人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring学习IoC

    到spring,大家都会津津乐道,什么依赖注入,什么控制反转,但是真的深入过源码了解吗,深入看过英文文档吗,自己尝试写过ioc吗,我相信大多数人都是没有的,我也是如此,所...

    相关 springIOC学习笔记

    一、IOC(控制反转) 软件开发原则:高内聚,低耦合。 有一个A功能需要实现 高内聚:现在在一个B类中就能完成A功能,现在B类就是内聚 低耦合:现在需要C类和D类一