IOC和AOP
IOC:控制反转
AOP:面向切面编程
1.IOC
IOC:Inverse Of Control
控制反转,把创建和管理对象的权利反转给Spring框架
Spring重点关注如何管理对象,对象之间的关系
IOC底层数据结构:Map
2.IOC案例
方式一:纯配置文件
IOC坐标--pom.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>day04</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="com.iweb.bean.Person"></bean>
</beans>
类(任意类都可以)
package org.example.bean;
public class Person {
private String name;
private int age;
}
测试类
package org.example.test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
public static void main(String[] args) {
// beanFactory(顶级父类)是IOC容器
BeanFactory beanFactory=new ClassPathXmlApplicationContext("applicationContext.xml");
Object person=beanFactory.getBean("person");
System.out.println(person);
}
}
方式二:配置文件+注解
配置文件
<!--
被扫描包下的对象都被Spring关注了,必须再加上指定注解
-->
<context:component-scan base-package="com.iweb.bean" />
对象、类
@Component
public class Person {
private String name;
private int age;
}
测试类
public static void main(String[] args) {
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("bean01.xml");
Object cat = beanFactory.getBean("cat");
System.out.println(cat);
}
方式三:纯注解
配置文件
//springconfig是一个配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration//标识一个类为spring的配置类(相当于xml配置文件),一般与bean一起使用
//@ComponentScan:告诉Spring在指定的包路径下扫描带有 @Component、@Service、@Repository、@Controller 等注解的类,并自动注册为Bean。
@ComponentScan({"org.example.bean"})// 扫描org.example包及其子包
public class SpringConfig {
@Bean("dog") // 指定Bean名称
public Dog getDog(){
return new Dog();
}
}
测试类
public static void main(String[] args) {
BeanFactory beanFactory =
new AnnotationConfigApplicationContext(SpringConfig.class);
Object person = beanFactory.getBean("person");
System.out.println(person);
}


3. DI
DI:Dependecy Injection,前提条件是对象必须都在IOC容器中
DI依赖注入写法
对象类1(person)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//person->属性 person依赖对应属性
//属性->person 将属性注入person类中
@Component//放在容器中
public class Person {
@Value("小红")
private String name;
@Value("20")//一般类型加value注解,为属性注入值,从配置文件注入
private int age;
@Autowired//1、引用类型加此注解,按类型自动注入依赖 2、可以用在构造方法上 3、可以用在setter方法上
private Cat cat;//配置文件2cat
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", cat=" + cat +
'}';
}
}
对象类2(cat)
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.awt.*;
@Component//将一个普通Java类标记为Spring容器中的Bean组件
public class Cat {
@Value("加菲猫")
private String kind;
@Value("120")
private float price;
@Override
public String toString() {
return "Cat{" +
"kind='" + kind + '\'' +
", price='" + price + '\'' +
'}';
}
}
测试类
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test2 {
public static void main(String[] args) {
BeanFactory beanFactory=new ClassPathXmlApplicationContext("bean01.xml");
Object person=beanFactory.getBean("person");
System.out.println(person);
}
}
结果截图
