1. Spring IOC/DI

1 通过配置文件进行

1.1 导入Spring依赖包

sping有很多依赖包,因此需要批量导入的方式,新建lib然后一个个导入的方式太慢。需要在项目右键properties-Java BuildPath里选择到指定目录后,全选,即可批量导入。
图片.png
图片.png

1.2 配置文件

配置文件的名字可以不确定,但推荐使用applicationContext.xml。

1.3 创建两个JavaBean

  1. 什么是JavaBean?

    JavaBean的标准

    1. 提供无参public的构造方法(默认提供)
    2. 每个属性,都有public的getter和setter
    3. 如果属性是boolean,那么就对应is和setter方法
  2. Category类别。

  1. package com.huang.bean;
  2. public class Category {
  3. private int id;
  4. private String name;
  5. public int getId() {
  6. return id;
  7. }
  8. public void setId(int id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. @Override
  18. public String toString() {
  19. // TODO Auto-generated method stub
  20. return "["+this.id+","+this.name+"]";
  21. }
  22. }
  1. Product商品。
  1. package com.huang.bean;
  2. public class Product {
  3. private int id;
  4. private String name="product2";
  5. private float price;
  6. //一个商品对应一种商品种类
  7. private Category category;
  8. public int getId() {
  9. return id;
  10. }
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public float getPrice() {
  21. return price;
  22. }
  23. public void setPrice(float price) {
  24. this.price = price;
  25. }
  26. public Category getCategory() {
  27. return category;
  28. }
  29. public void setCategory(Category category) {
  30. this.category = category;
  31. }
  32. @Override
  33. public String toString() {
  34. // TODO Auto-generated method stub
  35. return "["+this.id+","+this.name+","+this.price+" "+"\n"
  36. +"\t"+this.category+"]";
  37. }
  38. }

1.3 修改配置文件。用标签对声明两个Spring对象。

  1. 标签对作用
    1. bean标签对表示一个javabean对象,name属性指定这个bean的名字,class指定这个对象的类。
    2. bean标签下的property标签指定每个属性的复制情况,name指定属性名,value指定属性内容,如果是简单的数据类型可以用value直接赋值,如果是对象类型的数据类型,需要手动创建另外一个bean,用ref标签指向另一个bean。
  2. 配置文件实例
  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" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/aop
  9. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  10. http://www.springframework.org/schema/tx
  11. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  14. <bean name="c" class="com.huang.bean.Category">
  15. <property name="id" value="1" />
  16. <property name="name" value="category 1" />
  17. </bean>
  18. <bean name="p" class="com.huang.bean.Product">
  19. <property name="id" value="1" />
  20. <property name="name" value="Product 1" />
  21. <property name="price" value="10.2" />
  22. <property name="category" ref="c" />
  23. </bean>
  24. </beans>

1.4 Demo

  1. 代码 ```java package com.huang.demo;

import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.huang.bean.Category; import com.huang.bean.Product;

public class Demo1 { public static void main(String[] args) { // 指定Spring上下文环境 // IOC 反转控制 是Spring的基础,Inversion Of Control // DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。 ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { “applicationContext.xml” }); // 从Spring那里拿到一个对象 // context.getBean方法返回数据类型,返回的是Object类型,需要强制转换 // 注入了普通数据类型 Category c = (Category) context.getBean(“c”); System.out.println(c); // 注入了对象类型 Product p = (Product) context.getBean(“p”); System.out.println(p);

  1. }

}

  1. 2. 效果
  2. ![图片.png](https://cdn.nlark.com/yuque/0/2020/png/588175/1581918767383-0c675828-453c-4ae8-b612-2f0fa10efbdb.png#align=left&display=inline&height=175&name=%E5%9B%BE%E7%89%87.png&originHeight=350&originWidth=1181&size=32680&status=done&style=none&width=590.5)
  3. <a name="vexhg"></a>
  4. ## 2 IOC/DI
  5. <a name="RLA7D"></a>
  6. ### 2.1IOC和DI概念
  7. 1. IOC 反转控制 Spring的基础,Inversion Of Control
  8. 1. DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。
  9. <a name="klg0i"></a>
  10. ### 2.2 原理
  11. ![图片.png](https://cdn.nlark.com/yuque/0/2020/png/588175/1581918809812-7edd9214-b535-4dc3-b50a-be2cb154ee1f.png#align=left&display=inline&height=429&name=%E5%9B%BE%E7%89%87.png&originHeight=858&originWidth=1581&size=83709&status=done&style=none&width=790.5)
  12. <a name="W3gXK"></a>
  13. ## 3 通过注解方式
  14. <a name="tYlY8"></a>
  15. ### 3.1 数据类型为对象类型时使用注解1
  16. 1. 配置文件中注释掉Productcategory属性的赋值,同时添加标签允许使用注解方式。
  17. ```xml
  18. <!-- 允许使用注解方式 -->
  19. <context:annotation-config />
  20. <!-- 许多JavaBean实例 -->
  21. <bean name="c" class="com.huang.bean.Category">
  22. <property name="id" value="1" />
  23. <property name="name" value="category 1" />
  24. </bean>
  25. <bean name="p" class="com.huang.bean.Product">
  26. <property name="id" value="1" />
  27. <property name="name" value="Product 1" />
  28. <property name="price" value="10.2" />
  29. <!-- <property name="category" ref="c" /> -->
  30. </bean>
  1. 在Product这个bean文件的caetgory属性前添加autowired注解,这个注解可
  1. public class Product {
  2. private int id;
  3. private String name;
  4. private float price;
  5. //一个商品对应一种商品种类
  6. @Autowired
  7. private Category category;
  1. Demo,还是那个Demo测试结果也相同。

发现可以自动匹配上。

图片.png

3.2 数据类型为对象类型时使用注解2

  1. autowired注解有一个特点,如果能够匹配到多个指定类型的bean实例,那么就会报错。
  1. <!-- 许多JavaBean实例 -->
  2. <bean name="c" class="com.huang.bean.Category">
  3. <property name="id" value="1" />
  4. <property name="name" value="category 1" />
  5. </bean>
  6. <bean name="c2" class="com.huang.bean.Category">
  7. <property name="id" value="2" />
  8. <property name="name" value="category 2" />
  9. </bean>

图片.png

  1. 因此使用resource可以指定特定name的bean实例。
  1. public class Product {
  2. private int id;
  3. private String name;
  4. private float price;
  5. //一个商品对应一种商品种类
  6. @Resource(name="c2")
  7. private Category category;
  8. public int getId() {
  1. 运行Demo可以把Product实例与第二个Category匹配上。

图片.png

3.3 纯注解的方式

  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" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/aop
  9. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  10. http://www.springframework.org/schema/tx
  11. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  14. <!-- 纯注解的方式,指定bean的位置 -->
  15. <context:component-scan base-package="com.huang.bean" />
  16. </beans>
  1. 修改各个JavaBean,通过Component注解使得其成为一个bean。
  1. @Component("c")
  2. public class Category {
  3. private int id=1;
  4. private String name="Category 1";
  1. @Component("p")
  2. public class Product {
  3. private int id=1;
  4. private String name="product1";
  5. private float price=20.2f;
  6. // 一个商品对应一种商品种类
  7. @Autowired
  8. private Category category;
  1. 运行Demo,相同效果

图片.png

  1. 这种方法把类写死了,所有这个类的对象初始化各个属性都为特定值,所以还是推荐使用配置文件配置的方式。