一:IOC(控制反转)&DI(依赖注入)
IOC:控制反转是spring的2大核心之一,简单来说就是创建对象由以前的自己new 构造方法来调用,变成交给Spring创建对象。对于这个bean(IOC中所有的对象都称之为bean)的创建,Spring提供了2种配置方式方式:
(1)applicationContext.xml配置文件方式配置。
(2)注解方式配置。
DI:依赖注入,简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。DI是IOC的一种实现方式
二:一个IOC的例子(以applicationContext.xml配置文件方式配置)
1.新建项目(java project)
2.导入jar包
下载spring所需要的jar包: https://pan.baidu.com/s/1DEDA0nx1FgURZHBarcDGlA (提取码:ebs5)
3.编写2个对象
package DTO; public class Category { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package DTO; public class Product { private int id; private Category category; public int getId() { return id; } public void setId(int id) { this.id = id; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } }
4.编写applicationContext.xml
在src目录下新建一个applicationContext.xml,它是Spring的核心配置文件,通过配置即可获取Category对象
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 添加一个Category对象 --> <bean name="category" class="DTO.Category"> <!-- 往Category对象中注入一个name属性 --> <property name="name" value="category" /> </bean> <!-- 添加一个Product对象 --> <bean name ="product" class="DTO.Product"> <!-- 往Product对象中注入一个id属性 --> <property name="id" value="01" /> <!-- 往Product对象中注入一个Category对象属性 --> <property name="category" ref="category" /> </bean> </beans>
5.测试
public class test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"}); //获取Category对象 Category category = (Category) context.getBean("category"); //获取Category对象的name属性 System.out.println(category.getName()); //category //获取Product对象 Product product = (Product) context.getBean("product"); //获取Product对象的Category对象属性 System.out.println(product.getCategory()); //DTO.Category@52aa911c //获取Product对象的id属性 System.out.println(product.getId()); //01 } }
三:一个IOC的例子(以注解方式配置注入对象的行为)
1.在applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 添加注解配置 --> <context:annotation-config/> <!-- 添加一个Category对象 --> <bean name="category" class="DTO.Category"> <!-- 往Category对象中注入一个name属性 --> <property name="name" value="category" /> </bean> <!-- 添加一个Product对象 --> <bean name ="product" class="DTO.Product"> <!-- 往Product对象中注入一个id属性 --> <property name="id" value="01" /> <!-- 往Product对象中注入一个Category对象属性 --> <property name="category" ref="category" /> </bean> </beans>
2.在类中添加注解(@Autowired,@Resource)
package DTO; import org.springframework.beans.factory.annotation.Autowired; public class Product { private int id; @Autowired //这里的@Autowired也可以放在改属性的set方法上,或者是利用@Resource(name="category") private Category category; public int getId() { return id; } public void setId(int id) { this.id = id; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } }
3.测试
package DTO; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"}); //获取Category对象 Category category = (Category) context.getBean("category"); //获取Category对象的name属性 System.out.println(category.getName()); //category //获取Product对象 Product product = (Product) context.getBean("product"); //获取Product对象的Category对象属性 System.out.println(product.getCategory()); //DTO.Category@52aa911c //获取Product对象的id属性 System.out.println(product.getId()); //01 } }
四:一个IOC的例子(以注解方式配置bean本身)
1.在applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 告诉spring,所有bean都放在DTO这个包下 --> <context:component-scan base-package="DTO"/> <!-- 添加注解配置 --> <context:annotation-config/> <!-- 添加一个Category对象 --> <bean name="category" class="DTO.Category"> <!-- 往Category对象中注入一个name属性 --> <property name="name" value="category" /> </bean> <!-- 添加一个Product对象 --> <bean name ="product" class="DTO.Product"> <!-- 往Product对象中注入一个id属性 --> <property name="id" value="01" /> <!-- 往Product对象中注入一个Category对象属性 --> <property name="category" ref="category" /> </bean> </beans>
2.在类中添加注解(@Component)
@Component("category") public class Category { public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } private int id; private String name = "category"; //因为配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了 } @Component("product") public class Product { private int id = 1; @Autowired //这里的@Autowired也可以放在set方法上,或者是利用@Resource(name="category") private Category category; public int getId() { return id; } public void setId(int id) { this.id = id; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } }
3.测试
public class test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"}); //获取Category对象 Category category = (Category) context.getBean("category"); //获取Category对象的name属性 System.out.println(category.getName()); //category //获取Product对象 Product product = (Product) context.getBean("product"); //获取Product对象的Category对象属性 System.out.println(product.getCategory()); //DTO.Category@52aa911c //获取Product对象的id属性 System.out.println(product.getId()); //01 } }
转载于:https://www.cnblogs.com/nianyuyu/p/10923268.html