SpringIOC
目录
一、概念
1.1 控制权翻转(IOC)
1.2 Spring对bean的管理
1.2.1 创建对象
1.2.2 注入属性
1.2.2.1 基于xml配置文件的方式实现
1.2.2.2 基于注解的方式实现
二、实现
2.1 创建Spring的项目
2.2 使用代码实现
2.3 Spring管理Bean的方式
1. 基于 XML 配置的 Bean 管理
2. 基于注解的 Bean 管理
3. 纯注解开发(无 XML 配置)
四、Bean 的属性注入方式
三、代码
一、概念
1.1 控制权翻转(IOC)
将创建对象的权力交给Spring进行管理
1.2 Spring对bean的管理
1.2.1 创建对象
两种方法:1.基于xml配置文件的方式实现 。 2.基于注解的方式实现(@Component 针对普通类@Controller 针对表现层@Service 业务层@Repository 持久层)
1.2.2 注入属性
1.2.2.1 基于xml配置文件的方式实现
两种方法:1.get/set方法。 2.构造器
1.2.2.2 基于注解的方式实现
前两个是重要的实现
@Value 用于注入普通类型(String,int,double等类型)@Autowired 默认按类型进行自动装配(引用类型)@Qualifier 不能单独使用必须和@Autowired一起使用,强制使用名称注入@Resource Java提供的注解,也被支持,使用name属性,按名称注入
二、实现
2.1 创建Spring的项目
配置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>com.qcby</groupId><artifactId>Spring</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies></project>
创建Spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"></beans>
创建对应的代码文件
2.2 使用代码实现
将创建对象的权利交给 Spring 容器管理,开发者无需手动通过new
创建对象,直接从容器中获取。
传统方式需Demo demo = new Demo()
,IOC 方式通过 Spring 配置或注解自动创建对象,开发者通过context.getBean("demo")
获取。
public class UserTest {/** 传统的创建对象的方式* 这种方式是人为手动创建的,每次获取对象就需要new对象* */@Testpublic void run(){Demo demo = new Demo();demo.hello();}
/*
* IOC
* 启动Spring项目的时候,Spring给我们创建的
* Spring将创建的对象放入到IOC容器当中,我们在使用的时候只需要获取对象就行
* */@Testpublic void run1(){ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");Demo demo = (Demo) context.getBean("demo");demo.hello();}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--IOC管理对象的方式--><bean id="demo" class="com.qcby.Demo"/><!--<bean id="user" class="com.qcby.User"/>--><!--配置扫描--><context:component-scan base-package="com.qcby"/><!--<bean id="cat" class="com.qcby.Cat">--><!--property:完成属性注入的标签name:类类面属性的名称 value:赋的值 ref:对象映射--><!--<property name="age" value="10"/>--><!--<property name="num" value="100"/>--><!--<property name="name" value="小孩"/>--><!--<property name="height" value="188.22"/>--><!--<property name="demo" ref="demo"/>--><!--</bean>--><!--<bean id="demo" class="com.qcby.Demo"/>--><!--<bean id="dog" class="com.qcby.Dog">--><!--<property name="arr">--><!--<array>--><!--<value>1</value>--><!--<value>2</value>--><!--<value>3</value>--><!--</array>--><!--</property>--><!--<property name="list">--><!--<list>--><!--<value>熊大</value>--><!--<value>熊二</value>--><!--</list>--><!--</property>--><!--<property name="map">--><!--<map>--><!--<entry key="aaa" value="vvvv"/>--><!--<entry key="bbb" value="eeee"/>--><!--</map>--><!--</property>--><!--</bean>--><!--<bean id="user" class="com.qcby.User">--><!--<constructor-arg name="height" value="10.00"/>--><!--<constructor-arg name="name" value="张三"/>--><!--<constructor-arg name="demo" ref="demo"/>--><!--</bean>--><!--基于注解--><context:component-scan base-package="com.qcby"/></beans>
package com.qcby;import org.springframework.stereotype.Service;@Service
public class Demo {public void hello(){System.out.println("hello word");}
}
run1输出
run输出
2.3 Spring管理Bean的方式
1. 基于 XML 配置的 Bean 管理
创建bean
<bean id="demo" class="com.qcby.Demo"/>
<bean id="user" class="com.qcby.User"/>
注入属性
- setter 注入(普通类型 / 引用类型):
<bean id="cat" class="com.qcby.Cat"><!--property:完成属性注入的标签name:类类面属性的名称 value:赋的值 ref:对象映射--><property name="age" value="10"/><property name="num" value="100"/><property name="name" value="小孩"/><property name="height" value="188.22"/><property name="demo" ref="demo"/></bean>
构造器注入:
<constructor-arg name="height" value="10.00"/>
- 复杂类型注入
- 数组、List、Map:通过
<list>
、<map>
等标签配置。
- 数组、List、Map:通过
2. 基于注解的 Bean 管理
创建 Bean 的注解
@Component:通用组件注解。
@Controller:表现层组件(Web 控制器)。
@Service:业务层组件。
@Repository:数据访问层组件。
示例:@Service("userService") 或默认以类名首字母小写作为 Bean ID(如@Service对应userService)。
注入属性的注解
@Value:注入普通类型(字符串、数值等)。
@Autowired:按类型自动注入引用类型(需配合@Component等注解使用)。
@Qualifier:与@Autowired配合,按 Bean ID 指定注入对象。
3. 纯注解开发(无 XML 配置)
使用@Configuration定义配置类,@ComponentScan指定扫描包:
@Configuration
@ComponentScan("com.qcby")
public class SpringConfig {// 配置Bean定义...
}
通过AnnotationConfigApplicationContext加载配置类:
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
四、Bean 的属性注入方式
setter 注入
通过类的 setter 方法赋值,XML 中用<property>标签,注解中用@Value和@Autowired。
构造器注入
通过类的构造函数赋值,XML 中用<constructor-arg>标签,注解中需在构造函数上添加@Autowired。
复杂类型处理
数组 / 集合:XML 中用<list>、<set>、<map>标签,注解中直接注入集合类型(需保证集合元素已被管理)
三、代码
package com.qcby;import org.springframework.stereotype.Repository;import java.util.Arrays;
import java.util.List;
import java.util.Map;//@Repository
public class Dog {private int[] arr;private List<String> list;private Map<String,String> map;@Overridepublic String toString() {return "Dog{" +"arr=" + Arrays.toString(arr) +", list=" + list +", map=" + map +'}';}public int[] getArr() {return arr;}public void setArr(int[] arr) {this.arr = arr;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public void jump(){System.out.println("狗跳的很高");}
}
package com.qcby;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;//@Component
@Service
public class Cat {@Value(value = "10")private int age;@Value(value = "10")private Integer num;@Value(value = "10.01")private double height;@Value(value ="张三")private String name;@Autowiredprivate Demo demo;@Overridepublic String toString() {return "Cat{" +"age=" + age +", num=" + num +", height=" + height +", name='" + name + '\'' +", demo=" + demo +'}';}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Integer getNum() {return num;}public void setNum(Integer num) {this.num = num;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Demo getDemo() {return demo;}public void setDemo(Demo demo) {this.demo = demo;}public void run(){System.out.println("猫跑的很块");}
}
package com.qcby;import org.springframework.stereotype.Service;@Service
public class Demo {public void hello(){System.out.println("hello word");}
}
package com.qcby;import org.springframework.stereotype.Controller;//@Controller
public class User {private double height;private String name;private Demo demo;public User(double height, String name, Demo demo) {this.height = height;this.name = name;this.demo = demo;}@Overridepublic String toString() {return "User{" +"height=" + height +", name='" + name + '\'' +", demo=" + demo +'}';}public void fly(){System.out.println("我会飞.....");}
}
package com.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(value = "com.qcby")
public class SpringConfig {
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--IOC管理对象的方式--><bean id="demo" class="com.qcby.Demo"/><!--<bean id="user" class="com.qcby.User"/>--><!--配置扫描--><context:component-scan base-package="com.qcby"/><!--<bean id="cat" class="com.qcby.Cat">--><!--property:完成属性注入的标签name:类类面属性的名称 value:赋的值 ref:对象映射--><!--<property name="age" value="10"/>--><!--<property name="num" value="100"/>--><!--<property name="name" value="小孩"/>--><!--<property name="height" value="188.22"/>--><!--<property name="demo" ref="demo"/>--><!--</bean>--><!--<bean id="demo" class="com.qcby.Demo"/>--><bean id="dog" class="com.qcby.Dog"><property name="arr"><array><value>1</value><value>2</value><value>3</value></array></property><property name="list"><list><value>熊大</value><value>熊二</value></list></property><property name="map"><map><entry key="aaa" value="vvvv"/><entry key="bbb" value="eeee"/></map></property></bean><bean id="user" class="com.qcby.User"><constructor-arg name="height" value="10.00"/><constructor-arg name="name" value="张三"/><constructor-arg name="demo" ref="demo"/></bean><!--基于注解--><context:component-scan base-package="com.qcby"/></beans>
import com.config.SpringConfig;
import com.qcby.Cat;
import com.qcby.Demo;
import com.qcby.Dog;
import com.qcby.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserTest {/** 传统的创建对象的方式* 这种方式是人为手动创建的,每次获取对象就需要new对象* */@Testpublic void run(){Demo demo = new Demo();demo.hello();}
/*
* IOC
* 启动Spring项目的时候,Spring给我们创建的
* Spring将创建的对象放入到IOC容器当中,我们在使用的时候只需要获取对象就行
* */@Testpublic void run1(){ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");Demo demo = (Demo) context.getBean("demo");demo.hello();}@Testpublic void run2(){ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");User user = (User) context.getBean("user");System.out.println(user.toString());}@Testpublic void run3(){
// ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);Cat cat = (Cat) context.getBean("cat");System.out.println(cat.toString());}@Testpublic void run4(){ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");Dog dog = (Dog) context.getBean("dog");System.out.println(dog.toString());}}
<?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>com.qcby</groupId><artifactId>Spring</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies></project>