spring控制反转IOC总结

Spring IOC(控制反转)思想笔记 Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码。 案例 如果按照之前javaweb的固定方法,写一个简单的业务逻辑 一个DAO接口 public interface UserDao { public void getUser(); } 实现DAO接口 public class UserDaoImpl implements UserDao { @Overrid 阅读详情

项目内容:稍微理了下spring的IOC容器发展,在git的版本历史里可以看到IOC思想的不同实现方法。

在这里插入图片描述

一、spring介绍:

  • 概念:

    1. 是一个轻量级的控制反转IOC和切面编码AOP的容器框架。
    2. 它是为了解决企业应用开发的复杂性而创建的。
    3. 在spring的发展过程中,离它的初心越来越远。
  • 雏形:

    1. 最老的interface21框架是雏形。
  • Spring作者:

    1. Rod Johnson
  • 理念:

    1. IOC使开发更简单,整合一些技术。如SSH和SSM。
  • 特点:

    1. 很强的向后兼容性。

    2. 大杂烩,在SSH和和SSM发展中不断地往spring中加入别的东西。

  • Spring优点:

    1. 开源
    2. 轻量级(体积很小),非入侵式的
    3. 核心:控制反转IOC,面向切面AOP
    4. 由于有AOP所以支持事务的支持,对框架的整合支持。
  • Spring弊端:

    1. 发展太久,违背了当初的理念,也就是配置太多了,多到记不下来的程度。

二、控制反转(IOC )的思想:

(一)理解控制与反转:

Control:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的。而使用spring后,对象是由spring的bean容器来创建。

Inversion:程序本身不创建对象, 而变成被动的接收对象。

inversion of control:把创建对象的过程交给spring管理。

(二)假设编写的类有:

  1. UserDao实现类

    public class UserDaoByOracle {
        public void findUserInfoInDB() {
            System.out.println("通过Oracle获取User信息");
        }
    }
    
    public class UserDaoBySqlserver {
        public void findUserInfoInDB() {
            System.out.println("在SQL server数据库中获取了User的信息");
        }
    }
    
  2. UserServicel业务类

    public class UserServer {
    
        public void getUserInfo(){
            
            //UserDaoBySqlserver u = new UserDaoBySqlserver();
            //修改为:
            UserDaoByOracle u = new UserDaoByOracle();
            u.findUserInfoInDB();
        }
    }
    
    

(三)IOC的思想产生原因:

1. 没有IOC的时候 :

​ 我们是在ServiceImp层里面去new,去主动选择对应的DaoImp类,控制权在程序员,每次更新DaoImp的类型,比如从UserDaoByOracle更新UserDaoBySqlserver的类;那么ServiceImp都要去改变new出来的DapImp类,即从new UserDaoByOracle换成new UserDaoBySqlserver的类。

​ 虽然现在看来改动一句UserDaoByOracle u = new UserDaoByOracle()很容易,但是项目很大的时候,各个地方都有可能需要去改动,非常麻烦,难以维护。

2. 加入IOC思想(最简单的,在ServiceImp写setXXX方法):

public class UserServiceImp implements UserService {
    UserDao userDao;
//  UserDao userDao = new UserDaoByOracleImp();
//  UserDao userDao = new UserDaoBySqlserverImp();

    //利用set方式进行动态注入依赖类
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }

    public void getUserServer() {
        userDao.getUser();
    }
}

增加一个 setUserDao方法后,ServiceImp层的代码里面里面不再去new,而是从调用setUserDao的地方被动地接受传入的DaoImp类型。主动权在调用ServieImp的setUserDao方法这里。这样每次改变DaoImp的类型,切换mysql还是Oracle,就不用改动ServiceImp的代码了,直接在调用ServieImp的setUserDao方法这里,给ServiceImp传入不同的DaoImp类型就好了。

​ 以上的改动所表达的意思就是IOC的原型。

三、bean的引入:

(一)bean的概念:

定义:bean 定义包含称为配置元数据的信息,不理解但知道怎么用就好。

(二)实例化bean的手段:

1.用无参数的构造方法注册

注:也叫 构造器实例化(这个最常用,后续默认此方法)

	1.在配置文件中配置如下
		<?xml version="1.0" encoding="UTF-8"?>
		<beans xmlns="http://www.springframework.org/schema/beans"
		    
			<!-- 关键部分 -->
		    <bean id="bean1" class="Educoder.Bean1"></bean>
		
		</beans>
	这样我们就创建了一个id为user的Bean,之后就可以在项目中任意位置通过容器的getBean方法进行访问User类。
	
	<bean class="org.sang.User" id="user"/>
	
	2.定义要获取的bean1类
	public class Bean1 {
		public void print(){
			System.out.println("Bean1......");
		}
	}
	
	3.获取bean1
	public void textUser(){
		 //1.获取spring文件
		 ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
		 //2.由配置文件返回对象
		 Bean1 b = (Bean1)context.getBean("bean1");
		 System.out.println(b);
		 b.print();
}
2.使用静态工厂创建
	1.配置
	<bean id="bean2"   class="com.spring.demo.Bean2Factory"   factory-method="getBean2"></bean>
	
	2.定义要获取的bean2类
	public class Bean2 {
		public void print(){
			System.out.println("Bean2......");
		}
	}
	
	3.定义静态工厂类
	public class Bean2Factory {
		public   static Bean2 getBean2(){
			return new Bean2();
		}
	}
	
	4.取bean2
	public void textUser(){
		//1.获取spring文件
		ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
		 //2.由配置文件返回对象
		 Bean3 b = (Bean2)context.getBean("bean2");
		 System.out.println(b);
		 b.print();
	}
	
//还是bean节点, class 不再直接指向待实例化的bean2,而是指向静态工厂类-Bean2Factory,只是多了一个factory-method属性,该属性指明该类中的静态工厂方法名为"getBean2",这样Spring框架就知道调用哪个方法来获取bean2的实例了

3.使用实例工厂创建

	1.配置
	<bean id="bean3  factory" class="com.spring.demo.Bean3Factory"></bean>
	<bean id="bean3" factory-bean="bean3factory" factory-method="getBean3"></bean>
	
	
	2.定义要获取的bean3类
	public class Bean3 {
		public void print(){
			System.out.println("Bean3......");
		}
	}
	
	3.定义非静态工厂类
	public class Bean3Factory {
		public    Bean3 getBean3(){
			return new Bean3();
		}
	}
	
	4.取bean3
	public void textUser(){
	/1.获取spring文件
			 ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
			 //2.由配置文件返回对象
			 Bean3 b = (Bean3)context.getBean("bean3");
			 System.out.println(b);
			 b.print();
	}
	
//静态工厂类与非静态工厂类的区别是,前者不需要创建对象,直接可以调用静态方法创建bean;后者则要先创建对象,然后再通过对象调用其方法创建bean

(三)bean的生命周期:

原型模式:

  1. bean类的创建在调用.getBean(id)的时候,即创建了。

单例模式

  1. 当IOC容器被加载时,所有的Bean都被实例化了。

(四)Bean对象的作用域:

<bean id="bean2"   class="com.spring.demo.Bean2Factory" scope = "singleton"></bean>
<bean id="bean2"   class="com.spring.demo.Bean2Factory" scope = "prototype"></bean>

scope属性值:

scope属性可取值描述
singleton单例模式,每次从容器中取出的Bean对象都是同一个。spring默认选择。
prototype原型模式,每次从容器中取出的Bean对象,都会重新new一个。
request…
session…
application…

四、显式装配:

概念解释
依赖bean对象的创建依赖于容器
注入bean对象中的所有属性,由容器来注入

(一)IOC的实现-通过set方法完成依赖注入

xml注册bean,property标签完成依赖注入。底层还是调用的Set方法。

<?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="userDaoByOracleImp" class="org.experience.share.dao.UserDaoByOracleImp"></bean>
    <bean id="userDaoBySqlserverImp" class="org.experience.share.dao.UserDaoBySqlserverImp"></bean>

    <bean id="userServe" class="org.experience.share.serve.UserServe">
        <property name="userDao" ref="userDaoByOracleImp"/>
        //<property name="brand" value=" 红旗 CA72"/>
    </bean>

</beans>

bean标签的属性

属性作用
id唯一识别该bean的名称。比如使用构造器实例化该bean时,构造器通过该id的值去容器中找这个bean。使用注解@bean([name= ]),自动生成bean的时候,该bean的id默认为该类的名称首字母小写。
class该bean对应的类的实际绝对路径,无需带上.java后缀。

property标签的属性

属性作用
name该bean对象中的属性的名称。
ref该bean中的某个属性是一个类,则装配的时候,需要选择一个已经成为bean的类进行装入。
value该bean中的某个属性是一个基本类型,则装配的时候,指定相应的值。

通过setXXX方法完成依赖注入

	private UserDao userDao;

    public void setUserDao (UserDao userDao) {
        this.userDao = userDao;
    }

    <bean id="userDaoByOracleImp" class="org.experience.share.dao.UserDaoByOracleImp"></bean>
    <bean id="userDaoBySqlserverImp" class="org.experience.share.dao.UserDaoBySqlserverImp"></bean>

    <bean id="userServe" class="org.experience.share.serve.UserServe">
<!--        <property name="userDao" ref="userDaoBySqlserverImp"/>-->
        <property name="userDao" ref="userDaoByOracleImp"/>
    </bean>

(二)IOC的实现-通过构造器完成依赖注入

构造器完成依赖注入

public class UserServiceImp(){
    
    DaoBySqlserver daoBySqlserver;
    
    public UserServiceImp(){
        super();
    }
    
    public UserServiceImp(DaoBySqlserver daoBySqlserver){
        this.daoBySqlserver = daoBysqlserver;
    }
    
    public void getUserInfo(){
        print("...")
    }
}
<bean id="userServiceImp" class="org.wr.software.experience.service.imp.UserServiceImp">
		<constructor-arg index="0" value = "有参构造的第一个参数值" />
    	//<constructor-arg type="java.lang.String" value = "有参构造的参数值只有一个参数" />
    	//<constructor-arg name="实参名称" value = "有参构造的参数值" />
</bean>
注:constructor-arg标签-有参构造时使用

通过下标给构造参数赋值;

- index="0":表示给第1一个参数赋值
- value="": 具体值

通过类型给构造参数赋值;

- type="java.lang.String" 
- value = "有参构造的参数值只有一个参数"

通过参数名给构造参数赋值;

- name="实参名称"
- value = "有参构造的参数值"

五、自动装配:

注:自动装配是spring满足bean依赖的一种方式。

(一) XML注册Bean,配置autowired属性完成自动装配

autowire属性的值

值作用
ByName给这个bean对象里面的类属性赋值时,会自动在容器上下文中查找,和自己对象set方法后面的值(首字母小写),相同的Bean的id,成功找到就赋该Bean。
ByType给这个bean对象里面的类属性赋值时,会自动在容器上下文中查找,和自己对象属性类型相同的Bean的id,成功找到就赋值该Bean。
public class UserDaoByOracleImp implements UserDao {
    public void findUserInfoInDB() {
        System.out.println("通过Oracle获取User信息");
    }
}
public class UserServe {
    UserDao userDao ;

    public void getUserInfo(){

        userDao.findUserInfoInDB();
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}
  • byName

       <bean id="userDao" class="org.wr.software.experience.dao.imp.UserDaoBySqlserverImp"></bean>
       <bean id="userServiceImp" class="org.wr.software.experience.service.imp.UserServiceImp" autowire="byName"></bean>
       //会去匹配和id叫userDao的Bean, 即此处的userDao。
    
  • ByType

    <-- <bean id="userDao1" class="org.wr.software.experience.dao.imp.UserDaoByOracleImp"></bean>   -->
        <bean id="userDao2" class="org.wr.software.experience.dao.imp.UserDaoBySqlserverImp"></bean>
        <bean id="userServiceImp" class="org.wr.software.experience.service.imp.UserServiceImp" autowire="byType"></bean>
        //会去匹配和UserDao类型一致的Bean,这里配置的userDao2是UserDao的子类,故会被装配上。
        //若能匹配Bean超过一个,则报错,上面放开就会报错。
    

(二) XML注册Bean,注解完成自动装配

注:spring2.5后即开始支持注解实现。

注:若是直接在属性上加注解,则是通过底层的反射机制实现的。

注:如果是加在setXXX方法上,则是通过setXXX方法实现的。

对比@Autowired@Resource
注解来源Spring注解JDK注解(JSR-250标准注解,属于J2EE)
装配方式默认通过byType的方式来查找容器中的Bean;
若需要使用byName的方式来查找容器中的Bean;则需要配合使用@Qualifier(value = “beanName”)。
默认通过byName的方式来查找容器中的Bean,没找到才会按照byType的方式来查找。
@Resource([ name = “” ] / [ type = “” ])
属性@Autowired(required=False)表示依赖的类不允许是null类型。@Resource([ name = “” ] / [ type = “” ])
注意也可以写在setXXX方法上,前提是该类已经在Bean容器中。
  • @Autowired

    默认byType,如果用要用byName则必须要求这个对象存在。

  • @Resource

    默认byName,找不到再去byType,还没找到就报错。

  1. @Autowired的作用要生效:有一个地方要注意

①需要修改xml的命名空间;(加content)

②需要在xml文件中间加入 <context:annotation-config />,表示支持注解完成依赖注入。

即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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

    <bean id="userDao2" class="org.wr.software.experience.dao.imp.UserDaoBySqlserverImp"></bean>
    <bean id="userServiceImp" class="org.wr.software.experience.service.imp.UserServiceImp" />

</beans>

(三) 注解注册Bean,注解完成自动装配

  1. 能够注册Bean的注解:

    @component = @Service 、@Controller 、@Repository (@Scope… 、)

    @Autowired = @Resource

    //该类被spring管理了,即成为了Bean。
    //相当于<bean id = "user" class="org.www.xxx.xxx"/>,id默认为首字母小写版本
    @component
    //@Scope("prototype")
    public class User{
        @Value("WR")
        public String name;
        //相当于<property name = "name" value = "WR"/>
    }
    
  2. @component等注解的作用要生效:有两个地方要注意

    ①需要修改xml的命名空间;(加content)

    ②需要在xml文件中间加入 <context:annotation-config />,表示支持注解完成依赖注入。

    ③需要在xml文件中加入**<context:component-scan base-package=“org.wr.software.experience.dao”/>**,表示该目录下的注解生效。

    <?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:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:annotation-config/>
        <context:component-scan base-package="org.wr.software.experience.dao"/>
        <context:component-scan base-package="org.wr.software.experience.service"/>
    
    </beans>
    

六、自动装配(脱离xml)

实际上底层还是或多或少使用了第五点第(三)项里面的注解,只不过不需要再去配置XML文件了

  1. springboot中能够完成注册Bean的注解

    @Configuration 、@Bean

    //Configuration注解表示下面的这个类是一个配置类,即Bean.xml文件。
    //该注解的底层实现其实也加了@component
    @Configuration
    public class User{
    	
        //等价于<bean id="makeUserBean" class="org.xxx.xxx.xx" />
        //id为方法名,class为返回的类的位置。
        @Bean
        public  User makeUserBean(){
    		return new User();
        }
    }
    @component  = @Service 、@Controller 、@Repository (@Scope... 、)
    
    @Autowired = @Resource 
    
  2. 如果完全使用了配置类的方式去注册bean,那么只能通过AnnotationConfig上下文来获取容器,参数为@Configuration配置类对象。

    public class MyTest{
        public static void main(String [] args){
            AnnotationConfigApplicationContext acac = new AnnotationConfigApplictionContext("User.class);
            User u = (User) context.getBean("makeUserBean");
        }
    }
    
  3. 多认识几个注解

    @import(其他配置类)

    如果有多个@Configuration配置类对象,那么可以在任意一个@Configuation上写import(其他配置类),使之成为一个类。

    @ComponentScan(其他包的路径)

    如果你的其他包都在使用了@SpringBootApplication注解的main app所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了

    如果你有一些bean所在的包,不在main app的包及其下级包,那么你需要手动加上@ComponentScan注解并指定那个bean所在的包

七、注意点

  1. SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!
    “Application类”是指SpringBoot项目入口类。这个类的位置很关键:

    如果Application类所在的包为:io.github.gefangshuai.app,则只会扫描io.github.gefangshuai.app包及其所有子包,如果service或dao所在包不在io.github.gefangshuai.app及其子包下,则不会被扫描

  2. @Autowired是Spring 提供的,默认按照byType 注入,也就是bean的类型的来传入。如果需要指定名字,那么需要使@Qualifier("这是bean的id名字")

  3. @Resource装配顺序:

    ①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

    ②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

    ③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

    ④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

    @Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

个类的位置很关键:

如果Application类所在的包为:io.github.gefangshuai.app,则只会扫描io.github.gefangshuai.app包及其所有子包,如果service或dao所在包不在io.github.gefangshuai.app及其子包下,则不会被扫描

  1. @Autowired是Spring 提供的,默认按照byType 注入,也就是bean的类型的来传入。如果需要指定名字,那么需要使@Qualifier("这是bean的id名字")

  2. @Resource装配顺序:

    ①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

    ②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

    ③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

    ④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

    @Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

避坑指南:RK3576+Android14适配移远5G模组(RG200U)时,我遇到的3个‘巨坑’及解决方案 本文详细记录了RK3576芯片适配Android14系统与移远RG200U 5G模组过程中遇到的三大技术难题:RIL服务启动失败、HIDL兼容性矩阵配置错误及ttyUSB权限冲突。通过实战案例提供了动态库拷贝、HIDL版本链声明和SELinux策略调整等解决方案,帮助开发者高效完成5G模组集成,特别适用于基于kernel6.1的嵌入式开发场景。 阅读详情

相关推荐

ComfyUI-controlnet控制出图

提供加载预处理器节点。

Bu2n的博客 5494

【老王读Spring IoC-5】Spring IoC 小结——控制反转、依赖注入

Spring IoC 小结前言正文控制反转依赖注入AbstractApplicationContext#refresh()小结 系列博文: 【IoC-0】SpringIoC引入 【IoC-1】IoC之控制反转引入 【IoC-2】IoC之BeanDefinition扫描注册 【IoC-3】Spring bean 的创建过程 【IoC-4】IoC之依赖注入原理 相关阅读: @Resource与@Autowired的区别 bean name 的生成规则 前言 前面从源码的角度逐步分析了 Spring IoC 的实

老王的专栏 547

java结合Ai

Spring AI 是 AI 工程的应用框架。其目标是将Spring生态系统的设计原则(如可移植性和模块化设计)应用于AI领域,并促进使用POJO作为应用程序的构建块到AI领域。特征跨 AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步 API 和流 API 选项。还支持下拉以访问特定于模型的功能。聊天模型亚马逊基岩人类学Cohere的命令AI21 Labs的侏罗纪-2Meta 的 LLama亚马逊的泰坦人类学克劳德Azure 开放式 AI。

qq_67832732的博客 2848

spring IOC笔记,@Autowired 与@Resource

spring IOC笔记,@Autowired 与@Resource 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup) spring编程的风格 schemal-based-------xml annotation-based-----annotation java-based

jiachanghui007的博客 181

用WorkBuddy和ima搭建本地知识库:从概念到实操

在AI应用普及的今天,私有知识的高效管理与调用成为痛点。RAG(检索增强生成)技术通过将外部知识库与语言模型耦合,为精准问答提供了技术底座。然而,传统RAG方案往往涉及向量数据库、文本切分等复杂环节。一种更轻量的路径应运而生:借助WorkBuddy与ima的组合,将知识收集、语义检索与智能体工作流整合,让本地知识库真正服务于日常办公和研发场景。从概念到实操,系统解析这套轻量级方案的核心逻辑与配置方法,并对比重方案适用边界,帮助读者快速搭建属于自己的AI知识助手。

weixin_32830601的博客 417

TYPE-C PD协议实战:如何用LDR6028芯片实现边充电边OTG(附完整电路设计)

本文详细解析了如何利用LDR6028芯片实现TYPE-C接口在PD协议下的边充电边OTG功能。通过剖析PD协议双角色协商的核心挑战,提供了完整的硬件电路设计要点,包括Type-C接口配置、电源路径管理及系统框架,并附有调试实战指南,助力开发者构建稳定可靠的一线多用解决方案。

c6d7e8f9g的博客 1126

Spring源码的了解(三) Spring的注解的方法实现控制反转

学习地址:https://www.bilibili.com/video/av35914008/(别问 问就是蹭流量)(https://www.majiaxueyuan.com/front/showcoulist) 通过注解方式进行控制反转和依赖注入(还是用User-UserDao-UserService的流程来) 是创建好了的对象User UserDao 以及UserService 这次...

GinChou的萌新博客 386

ROS2中间件选型指南:FastDDS与CycloneDDS零拷贝机制对比与实战

在机器人开发中,通信中间件是连接分布式节点的核心纽带,其性能直接影响系统的实时性与可靠性。DDS作为ROS2默认的通信标准,通过发布订阅模型和QoS策略,为高频大带宽场景提供了灵活的数据分发能力。并行计算与高性能传输的需求,推动了零拷贝技术的演进——从传统序列化到共享内存乃至指针传递,旨在减少数据复制开销、降低延迟。在激光雷达点云、相机图像等场景下,中间件的选型尤为关键。FastDDS凭借与ROS2的深度集成和丰富文档成为入门首选,而CycloneDDS在低延迟和资源占用上表现更优,借助iceoryx实现了

weixin_28726391的博客 251

@Autowired用法详解

Autowired: 自动装配 Spring IOC就是控制反转,Spring通过依赖注入的方式,给你自动生成对象并注入到你想要的地方,我只用在想要对象的地方声明一下就好了。@Autowired就可以加到你想要对象的上面,表示你需要给我注入(装配)这个对象。 多插一句: 一般想要的地方都会是一个接口,IOC会根据上下文给你配置实现这个接口的对象。这也就是反射,动态加载类对象,并生成对象,在代码执行...

baihehaitangyijiu的博客 722

DIY便携式PEMF磁脉冲治疗仪:百元成本自制生物物理疗法设备

脉冲电磁场(PEMF)疗法是一种基于生物物理原理的非侵入性技术,它通过特定频率的电磁脉冲作用于细胞层面,影响细胞膜电位和离子通道活动,从而可能调节细胞代谢与功能。其技术价值在于提供了一种物理干预手段,在健康科技和生物黑客领域被探索用于放松、恢复等场景。实现PEMF的核心是通过信号发生与功率放大驱动电磁线圈产生可控磁场。本文以蓝牙音频模块和智能手机App为切入点,详细解析了如何利用低成本电子元件(如DFRobot XY-WRBT模块和漆包线线圈)构建一个可自定义频率的便携式PEMF设备,涵盖了从电路设计、线圈

weixin_31476015的博客 346

【ComfyUI 基础教程】ComfyUI 局部重绘工作流教程

本篇指南将带你了解 ComfyUI 中的局部重绘工作流,并带你完成一个局部重绘的示例,以及遮罩编辑器的使用等。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 302

@Autowired注解

Spring框架中的@Autowired注解

yydxcn的博客 318

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

丨汀、的博客 5419

Spring IOC控制反转

在Spring容器中管理的Bean对象的作用域,可以通过scope属性或用相关注解指定其作用域。最常用是singleton(单例)或prototype(多例)。singleton:单实例,是默认值。这个作用域标识的对象具备全局唯一性。当把一个 bean 定义设置scope为singleton作用域时,那么Spring IOC容器只会创建该bean定义的唯一实例。也就是说,整个Spring IOC容器中只会创建当前类的唯一一个对象。

weixin_58069198的博客 904

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring IOC控制反转原理详解

查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。

2301_76166241的博客 1079

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring 控制反转 IOC

1.spring 控制反转介绍: 控制反转IOC(Inversion of Control),是一种包装技术类型,它本身不属于新的内容,说的再简单一点,所有对象的实例化操作都不再使用关键字new了(反射机制)。那么为什么现在的代码之中需要编写控制反转的操作呢?为了更好的解释这个问题.下面编写一个实际的程序分析。 如果员工出差,那么员工所需要做的核心处理--办理核心的操作业务,出差的目的,但...

抛弃幻想,准备斗争 976

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring核心之控制反转(IOC)

1、@Autowired是Spring自带的,@Resource是JSR250规范实现的,@Inject是JSR330规范实现的2、@Autowired、@Inject用法基本一样,不同的是@Inject没有required属性3、@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的4、@Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Named一起使用,@Resource则通过name进行指定。

埃泽漫笔 1331

Spring 控制反转(IOC)容器

IoC 容器是 Spring 的核心,也可以称为 Spring 容器。Spring 通过 IoC 容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期。 Spring 中使用的对象都由 IoC 容器管理,不需要我们手动使用 new 运算符创建对象。由 IoC 容器管理的对象称为 Spring Bean,Spring Bean 就是 Java 对象,和使用 new 运算符创建的对象没有区别。 Spring 通过读取 XML 或 Java 注解中的信息来获取哪些对象需要实例化。 Spring 提供

m0_53698336的博客 1146

spring之控制反转IOC

spring的ioc,控制反转

奶厂小程的博客 293

Spring IoC:解耦与控制反转的艺术

Spring IoC(控制反转)是Spring框架的核心思想之一,它通过将对象的创建和管理权交给Spring容器,实现了代码的解耦与灵活性。IoC不仅简化了开发流程,还提高了系统的可测试性和可维护性。通过控制反转,开发者可以更专注于业务逻辑的实现,而不是对象的创建与管理。掌握Spring IoC的思想与实践,是每一位Spring开发者必须具备的核心能力,也是构建高质量、可扩展应用的重要基石。希望本文能帮助你理解 Spring IoC 的核心概念,并在实际项目中灵活运用!

2302_81090306的博客 1349

Spring入门——IoC控制反转

本博客是博主用于学习Spring的博客,如果疏忽出现错误,还望各位指正。

m0_60631836的博客 1163

Spring框架(二)Spring控制反转IoC详解

Spring框架(二)Spring控制反转IoC详解

淡沫初夏zz的博客 2144

Spring之IoC控制反转

本内容采用最新SpringBoot3框架版本,控制反转(Inversion of Control,IoC)是面向对象编程中的一个设计原则,用来降低程序代码之间的耦合度。

分享各类实战项目,提供源码与教程,供大家学习参考。 993

Spring学习:IOC控制反转

一、Spring概述: Spring是一个开源框架,其存在的根本使命就是简化JAVA开发。为了降低JAVA开发的复杂性,Spring采取了以下四种关键策略: 基于POJO的最轻量级和最小侵入性编程; 通过依赖注入和面向接口实现松耦合; 基于切面和惯例进行声明式编程; 通过切面和模板减少样板式代码。 1.1 Spring有两个核心部分:IOC和AOP: (1) IOC: 控制反转,把创建对象过程交给Spring进行管理; (2) AOP: 面向切面,不修改源代码,...

sssxlxwbwz的博客 1979

Spring框架-IoC控制反转

Spring是一款主流的 Java EE 开源框架,目的是用于简化Java企业级引用的开发难度和开发周期;从简单性、可测试性的角度而言,任何Java应用都可以从Spring中受益;Spring框架提供自己提供功能外,还提供整合其他技术和框架的能力Spring提供了以下多个注解,这些注解可以直接标注在java类上,将它们定义成Spring Bean注解说明@Component。

qq_68630091的博客 894

Spring框架 —— 控制反转IOC

在前一篇文章中荔枝已经初步了解了Spring并通过一个入门案例了解了Spring的基本操作,接下来荔枝就要梳理Spring中的最为重要的知识点之一——IoC控制反转,控制反转和属性注入均是基于Java中的反射机制来实现的。所以学习这个知识点之前必须要学习Java的反射机制。在这篇文章中荔枝会着重梳理两种获取bean和操作bean的方式,其中基于注解方式来操作bean更为重要。

荔枝当大佬的博客 1394
上一篇: 理解跨域问题,前后端分离中,在springboot后端解决跨域问题
下一篇: Python-求First、Follow、select集合以及预测分析表和表驱动程序;
wang__Ray
博客等级 码龄8年 59粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值