Spring - SpringIOC容器详解
一、什么是Spring IOC:
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。
在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
二、Spring中如何实现DI(依赖注入)
1.构造器注入
<bean id="beanName" class="BeanClassName"> <constructor-arg index="构造器中的位置" name="参数名" value="简单值" type="Java类型"/> <constructor-arg index="构造器中的位置" name="参数名" ref="OtherBeanName" type="Java类型"/> </bean>
2.Setter注入
<bean id="beanName" class="BeanClassName"> <property name="字段名" value="简单值"> <property name="字段名" ref="OtherBeanName"> </bean>
3.接口注入:不常用,例如JNDI注入tomcat自带数据库连接池
三、XML配置Bean
0.命名空间
<?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">
1.装配简易值和对象
<bean id="beanName" class="类的全限定名"> <property name="字段名" value="简易值"/> <property name="字段名" ref="otherBeanName"/> </bean>
2.装配集合
<bean id="beanName" class="类的全限定名"> <property name="字段名set"> <set> <value>value</value> //<ref bean="otherBeanName"> </set> </property> <property name="字段名list"> <list> <value>value</value> //<ref bean="otherBeanName"> </list> </property> <property name="字段名props"> <props> <prop key="name">value</prop> </props> </property> <property name="字段名map"> <map> <entry key="key" value="value"/> //<entry key="key" value-ref="otherBeanName"/> //<entry key-ref="otherBeanName" value-ref="otherBeanName"/> </map> </property> <property name="数组"> <array> <value>value1</value> </array> </property> </bean>
四、注解配置Bean
1.@Component 配置Bean
配置在类上,代表这个类会被SpringIOC扫描成一个Bean,注解中属性value表示为Bean的名字,如同XML中配置的id,不配置
value的值时,默认是将类名的首字母小写。
@Component
@Component("beanName")
2.@ComponentScan 配置注解扫描器
配置在类上,因为SpringIOC容器并不知道要扫描哪个类和包,需要定义一个SpringConfig类来告诉它,注解默认扫描该类所在包
如果想扫描指定包,注解属性basePackages中,多个包,使用逗号隔开
@ComponentScan
@ComponentScan(basePackages={"包1","包2"})
3.@Value 简单值注入
配置在类的字段(属性)上,其中放入的是字符串,注入时会自动转换类型,同样可以使用EL表达式来注入资源属性文件中的值
@Value("1")
@Value("xxxx")
@Value("${jdbc.database.driver}")
4.@Autowired 自动装配属性
配置在类的字段(属性)上、方法及构造函数的参数中完成自动装配的工作,可以通过 @Autowired的使用来消除 setter ,getter方法
此注解是按照类型来注入的,当有多个bean同时实现一个接口时,可以使用@Primary和@Qualifier注解来消除歧义。
@Autowired
5.@Primary 优先注入
配置在某个接口有多个实现类的某个实现类上,在其他Bean中使用@Autowired注入该接口类型的bean时,优先注入这个实现类的bean。
和@Component一起使用,否则无效。
6.@Qualifier 指定注入
配置在类的字段(属性)上,和@Autowired一起使用,当@Autowired注入时,指定注入的bean,该注解的属性(value)指定Bean的name
@Qualifier("beanName")
7.@Configration 配置菜单
配置在类上,此注解通常为了通过 @Bean
注解生成 SpringIOC容器管理的类,本质和@Component一样。
@Configration
8.@Bean 配置第三方类的Bean
配置在方法上,将方法返回的对象生成Bean,交给SpringIOC容器管理,要求此方法所在类也被配置成Bean,通常使用@Configration,
注解的属性name,指定生成的Bean的name
@Bean(name="beanName")
9.@Resource(name="beanName") jdk的自动装配
相当于@Autowired,区别在于Resource先按beanName来找注入的Bean,如果没有指定名字的Bean,再按照类型来注入。
五、启动SpringIOC容器的方式
1.Spring采用xml配置时,根据xml文件来启动
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");ClassName cn = (ClassName)ac.getBean("beanName");
2.Spring采用注解配置时,根据Springconfig配置类来启动
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class); ClassName cn = (ClassName)ac.getBean("beanName");
六、注解和XML的混合使用
1.注解引用XML
@ImportResource({"classpath:spring-config.xml","classpath:spring-config1.xml"}),配置在SpringConfig类上
2.多个注解配置类
@Import({SpringConfig1.class,SpringConfig2.class})
3.XML扫描注解
<context:component-scan base-packages="包名1,包名2"/>
4.多个XML文件
<import resource="spring-config2.xml"/><import resource="spring-config3.xml"/>
七、加载属性文件
· 1.XML加载资源属性文件
<context:property-placeholder ignore-resource-not-found="true" location="classpath:database-config.properties"/>
2.注解加载资源属性文件
@PropertySource(value={"classpath:database-config.properties"},ignoreResourceNotFound="true")
value={"classpath:database-config.properties"} : 资源属性文件位置
ignoreResourceNotFound="true" : 当扫描不到此资源配置文件时,不报错
八、Bean的作用域
Spring提供了4种作用域:singleton(单例) prototype(原型) Session(会话) request(请求)
XML中的bean中有属性:scope ,默认是单例,可以设置为原型。会话和请求的作用域需要在web.xml中配置
注解中有注解@Scope("singleton"),@Scope("prototype"),默认是单例,可以设置为原型。
Spring - SpringIOC容器详解的更多相关文章
- 三、spring成长之路——springIOC容器详解(上)
目录 一.springIOC 一.springIOC 控制反转和依赖注入: 简单的说就是将对象的创建,属性的的设置交给spring容器进行管理,而不再由用户自己创建,当用户需要使用该接口或者类的时 ...
- Spring ——Spring IoC容器详解(图示)
1.1 Spring IoC容器 从昨天的例子当中我们已经知道spring IoC容器的作用,它可以容纳我们所开发的各种Bean.并且我们可以从中获取各种发布在Spring IoC容器里的Bean,并 ...
- [Spring学习笔记 1 ] Spring 简介,初步知识--Ioc容器详解 基本原理。
一.Spring Ioc容器详解(1) 20131105 1.一切都是Bean Bean可是一个字符串或者是数字,一般是一些业务组件. 粒度一般比较粗. 2.Bean的名称 xml配置文件中,id属性 ...
- Spring Boot异常处理详解
在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...
- spring注入参数详解
spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...
- Spring的lazy-init详解
1.Spring中lazy-init详解ApplicationContext实现的默认行为就是在启动服务器时将所有singleton bean提前进行实例化(也就是依赖注入).提前实例化意味着作为初始 ...
- Spring Boot 配置文件详解
Spring Boot配置文件详解 Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件.他们的作用都是修改Spring Boot自动配置的默认值.相对于prop ...
- (转)Spring事务管理详解
背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...
- Spring IOC使用详解
SpringIOC使用详解 一.IOC简介 IOC(Inversion of Control):控制反转,即对象创建的问题.通俗地讲就是把创建对象的代码交给了Spring的配置文件来进行的.这样做的优 ...
随机推荐
- LeetCode:二叉树剪枝【814】
LeetCode:二叉树剪枝[814] 题目描述 给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1. 返回移除了所有不包含 1 的子树的原二叉树. ( 节点 X 的子树为 X ...
- elasticsearch 简单聚合查询示例
因为懒癌犯了,查询语句使用的截图而不是文字,导致了发布随笔的时候提示少于150字的随笔不能发布. 我就很郁闷了. 下面的查询都是前段时间工作中使用过的查询语句. 开始的时候是使用nodejs构建es查 ...
- spring-boot-starter-parent
在官方文档的第三部分的13块讲述了引用的管理,官方推荐的是使用Maven和Gradle. 我一直在用的是maven,而且使用maven有些优势–spring-boot-starter-parent,这 ...
- 【LeetCode】求众数
给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. class Solution(object): ...
- process调用protothread机制的相关宏定义——用HelloWorld进程诠释
一.HelloWorld例子 #include "contiki.h" #include <stdio.h> /* For printf() */ /*-------- ...
- axios无法在ie9,10,11环境下运行的问题解决
npm install es6-promise --save-dev import promise from 'es6-promise'; promise.polyfill();
- BZOJ 1638 [Usaco2007 Mar]Cow Traffic 奶牛交通:记忆化搜索【图中边的经过次数】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1638 题意: 给你一个有向图,n个点,m条有向边. 对于所有从入度为0的点到n的路径,找出 ...
- intent实现Activity之间跳转的各种传值
一.在Activity之间传递String类型的数据 传递 @Override public void onClick(View v) { String num1 = firstNum.getText ...
- P2743(poj1743) Musical Themes[差分+后缀数组]
P2743 乐曲主题Musical Themes(poj1743) 然后呢这题思路其实还是蛮简单的,只是细节特别多比较恶心,忘记了差分带来的若干疏漏.因为转调的话要保证找到相同主题,只要保证一段内相对 ...
- jupyter-notebook重设项目工作路径
一. . Anaconda Prompt 命令(方法没生效) 1 选择一个用于存放config文件的文件夹(先创建) 2 在cmd中进入该文件夹的路径 3在cmd中 输入命令 jupyter not ...