Spring学习笔记之IoC

本文详细介绍了Spring框架的核心概念,包括依赖注入、控制反转等,并探讨了构造器注入与setter注入的区别及适用场景。
Spring是指一个用于构造java应用程序的轻量级框架。Spring框架的核心基于“控制反转(Inversion of Control, IoC)”的原理。

IoC是一种将组件依赖关系的创建和管理置于程序外部的技术。

[img]/upload/attachment/112733/b2ce4fff-448b-3e36-82b3-6e4ec30de8a3.bmp[/img]

1、在依赖托拽中,依赖关系是根据需要从一个集中的注册处获取的。
如:

BeanFactory factory = new XmlBeanFactory(new FileSystemResource(config.getServletContext().getRealPath("") + "/WEB-INF/classes/spring/applicationContext.xml"));
AdvDao advDao = (AdvDao)factory.getBean("advDao");


而上下文配置依赖查找是在容器管理的资源中进行查找的。
如:

public void perFormLoopup(Container container) {
AdvDao advDao = container.getAdvDao("advDao");
}



2、构造器依赖注入是在组件的构造器处提供依赖关系的注入,这种组件声明一个构造器或者一组构造器从构造参数中获取依赖关系。
如:

public class TestJob implements TestInterface{
private String message;

public TestJob(){
}
public TestJob(String message){
this.message = message;
}

public String getMessage(){
return message;
}

@Override
public void print() {
System.out.println(getMessage());
System.out.println("This is TestJob!");
}

}

构造器依赖注入的bean配置:

<bean id="testJob" class="con.anne.test.TestJob">
<constructor-arg>
<value>This is a configurable message</value>
</constructor-arg>
</bean>



3、Setter注入:
如:

public class AdvDaoImpl implements AdvDao {
private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}

通过xml支持来配置setter依赖注入,需要在<bean>节点下指定<property>。如:

<bean id="advDao" class="com.anne.dao.impl.AdvDaoImpl">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>



4、对比构造器注入与setter注入:
一般推荐setter注入。
在使用组件之前就需要实例化存在依赖关系的类的时候,构造器注入特别有用。因为setter方法的调用次序是无法规定的,在使用组件之前,也许并非所有必要的setter方法都会被调用到。
在以下情况时,setter注入更具有优势:
① 对象需要配置的熟悉比较多。
② 对象既有简单类型的依赖,也有与对象的依赖。
③ 对象有可能位于具体继承体系中。
④ 对象有多于一个统一类型的依赖关系。
⑤ 对象必须提供运行时修改依赖关系的途径。

5、依赖注入容器的核心时Bean工厂。
Spring提供了两个主要的BeanFactory的实现,一个是DefaultListableBeanFactory,还有一个是XmlBeanFactory。
对于DefaultListableBeanFactory来说,会使用PropertiesBeanDefinitionReader从一个properties文件中读取Bean的定义信息。

public class BeanFactoryTest {

public static void main(String[] args) throws Exception {
BeanFactory factory = getBeanFactory();
TestJob testJob = (TestJob)factory.getBean("testJob");
testJob.print();
}

private static BeanFactory getBeanFactory() throws Exception {
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(factory);

Properties props = new Properties();
props.load(new FileInputStream("/config/beans.properties"));

reader.registerBeanDefinitions(props);
return factory;
}

}

而对于XmlBeanFactory来说,则使用XmlBeanDefinitionReader从XML文件中读取bean。
XmlBeanFactory派生于DefaultListableBeanFactory并简单的进行了扩展,使它能够通过XmlBeanDefinitionReader自动获取配置信息。

//use XmlBeanFactory
XmlBeanFactory xmlFactory = new XmlBeanFactory(new FileSystemResource("/config/beans.xml"));



6、需要注意的:
① 默认情况下,Spring中的所有bean都是单例的,Spring维护bean的唯一实例,对bean工厂的getBean()方法的每一次调用都返回同一个实例。
即:

<bean id="advDao" class="com.anne.dao.impl.AdvDaoImpl" singleton="true">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>

把singleton="true"改为singleton="false",就可把单例转换为非单例。
② Spring支持四种装配模式:通过命名,通过类型,构造器,自动检测。
配置bean的属性autowire="byName",那么Spring会将每个属性连接到一个同名的bean上。
③ bean也可以继承属性。
给bean配置上parent="parentBean"即可。
Bean的继承不需要符合java的继承层次关系。应该把bean继承看作模板的功能,而不是实际的继承功能。
考虑可再生能源出力不确定性的商业园区用户需求响应策略(Matlab代码实现)内容概要:本文围绕“考虑可再生能源出力不确定性的商业园区用户需求响应策略”展开,结合Matlab代码实现,研究在可再生能源(如风电、光伏)出力具有不确定性的背景下,商业园区如何制定有效的需求响应策略以优化能源调度和提升系统经济性。文中可能涉及不确定性建模(如场景生成与缩减)、优化模型构建(如随机规划、鲁棒优化)以及需求响应机制设计(如价格型、激励型),并通过Matlab仿真验证所提策略的有效性。此外,文档还列举了大量相关的电力系统、综合能源系统优化调度案例与代码资源,涵盖微电网调度、储能配置、负荷预测等多个方向,形成一个完整的科研支持体系。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源系统规划与运行的工程技术人员。; 使用场景及目标:①学习如何建模可再生能源的不确定性并应用于需求响应优化;②掌握使用Matlab进行商业园区能源系统仿真与优化调度的方法;③复现论文结果或开展相关课题研究,提升科研效率与创新能力。; 阅读建议:建议结合文中提供的Matlab代码实例,逐步理解模型构建与求解过程,重点关注不确定性处理方法与需求响应机制的设计逻辑,同时可参考文档中列出的其他资源进行扩展学习与交叉验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值