当前位置: 首页 > news >正文

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>等标签配置。

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>

http://www.lqws.cn/news/466579.html

相关文章:

  • 集群聊天项目服务器----JSON库
  • 文生视频(Text-to-Video)
  • mysql导入大sql(比如10GB的sql文件)
  • gRPC 框架面试题精选及参考答案
  • 《HTTP权威指南》 第4章 连接管理
  • RA4M2开发涂鸦模块CBU(3)----定时器GPT-PWM调光
  • 18年磨一剑!开利科技启动数字化增量投资新时代
  • 探索 Vue 替代方案
  • Linux文件元信息完全指南:权限、链接与时间属性
  • jar is missing
  • ubuntu22.04下ch341驱动问题
  • Web攻防-XSS跨站Cookie盗取数据包提交网络钓鱼BEEF项目XSS平台危害利用
  • 广州华锐互动:以技术创新引领虚拟现实体验新高度
  • 私有规则库:企业合规与安全的终极防线
  • Go 语言 GMP 调度模型解析
  • 从流量为王到留量为王:开源链动2+1模式、AI智能名片与S2B2C商城小程序的协同创新路径
  • 推客小程序系统开发全攻略:构建社交电商新生态
  • 亚马逊认证考试系列 - 第一部份:基础服务 - AWS SAA C03
  • Maven-添加子模块
  • SylixOS 下的消息队列
  • SQLite 数据库操作完整指南
  • 逆向入门(14、15)程序逆向篇-Brad Soblesky.1-fty_crkme3
  • AWS-SAA 第二部份:安全性和权限管理
  • 操作系统进程与线程核心知识全览
  • Softhub软件下载站实战开发(六):软件配置面板实现
  • LeetCode 1432.改变一个整数能得到的最大差值:暴力模拟/贪心
  • 企业公用电脑登录安全管控的终极方案:ASP操作系统安全登录管控方案
  • c++ 虚继承
  • 【软考高级系统架构论文】论云上自动化运维及其应用
  • 嵌入式开发之嵌入式系统架构如何搭建?