spring创建bean及数据注入
通过spring的IoC可以实现由配置文件来创建类的对象,可以降低类鱼类之间的耦合,
通常我们都是在代码中控制对象的生成和属性注入,而使用IoC后,就可以将设计好的类交给IoC容器,让容器去控制对象的生成和属性的注入,称为控制反转。生成对象的过程就是将对象依赖的属性进行注入的过程,因此也称依赖注入。
1.实例化bean:通过无参构造;工厂静态方法;工厂非静态方法等
2.属性注入:set方法注入;构造器(构造方法)注入
各类属性的注入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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> <!-- lazy-init="true" : true:需要用的时候才实例化bean,默认加载配置文件时候实例化bean -->
<!-- init-method="init" 初始化bean,调用init方法 -->
<!-- destroy-method="destroy" 销毁bean调用destroy方法 -->
<!-- scope="prototype" prototype:创建对象不是单例模式,默认singleton: 单例 -->
<bean id="user" class="ni.jun.yang.bean.User" lazy-init="true"
init-method="init" destroy-method="destroy" scope="prototype">
<!--构造赋值 -->
<constructor-arg name="card" ref="payCard"/>
<constructor-arg name="name" type="java.lang.String" value="zhangsan"/>
<constructor-arg name="age" type="int" value="123"/>
</bean> <bean id="user1" class="ni.jun.yang.bean.User" lazy-init="true" scope="prototype"> <!-- list集合注入值 -->
<property name="cards">
<list>
<ref bean="payCard"/>
<ref bean="payCard1"/>
<ref bean="payCard2"/>
</list>
</property> <!-- set集合注入值 -->
<property name="setCards"> <set>
<ref bean="payCard"/>
<ref bean="payCard1"/>
<ref bean="payCard2"/>
</set>
</property> <!-- map集合注入值 -->
<property name="mapCards">
<map>
<entry key="1" value-ref="payCard" ></entry>
<entry key="2" value-ref="payCard1"></entry>
<entry key="3" value-ref="payCard2"></entry>
</map>
</property> <!--Properties集合注入值 -->
<property name="proCards">
<props>
<prop key="1">中国银行</prop>
<prop key="2">农业银行</prop>
<prop key="3">建设银行</prop>
</props>
</property> </bean> <!--set方法赋值 -->
<bean id="payCard" class="ni.jun.yang.bean.PayCard">
<property name="id" value="98746546764"></property>
<property name="bankName" value="中国银行"></property>
</bean>
<bean id="payCard1" class="ni.jun.yang.bean.PayCard">
<property name="id" value="12365478932544"></property>
<property name="bankName" value="农业银行"></property>
</bean>
<bean id="payCard2" class="ni.jun.yang.bean.PayCard">
<property name="id" value="45678975456751"></property>
<property name="bankName" value="建设银行"></property>
</bean> </beans>
对象的获取:
ApplicationContext ctxt = new ClassPathXmlApplicationContext("user-bean.xml");//配置文件名字
User user = (User) ctxt.getBean("user"); //bean标签的id值
3.自动装配:autowire=byName(通过属性名字) autowire="byType" (通过类型) autowire="constructor"(通过构造器)
感觉不是很好用:
byName主要是根据set方法来进行自动注入值的,相对靠谱
byType 如果有多个值,就会出异常,它不知道到底该用哪个值去装配
constructor :与 byType 非常相似
感觉用自动装配,代码的可读性,不如手动装配注入,而且byType 这种方式容易出异常
spring创建bean及数据注入的更多相关文章
- Spring 创建bean的模式
在默认情况下,spring创建bean是单例模式 scope="singleton ",还有一种方式为多例模式[prototype] scope sing ...
- spring 创建Bean最全实现方法
创建bean方式,spring创建bean的方式包含:自动注入方式和人工注入方式.分别为:1)xml 配置化方式 2)@bean注解注入方式3)@Component方式 4)接口注入方式 5)imp ...
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- spring创建bean模式singleton与prototype的区别
spring 创建bean有单例模式(singleton)和原始模型模式(prototype)这两种模式. 在默认的情况下,Spring中创建的bean都是单例模式的(注意Spring的单例模式与Go ...
- Spring创建Bean的顺序
一直对Spring创建bean的顺序很好奇,现在总算有时间写个代码测试一下.不想看过程的小伙伴可以直接看结论 目录结构: 其中:bean4.bean5包下的class没有注解@Component,测试 ...
- Spring核心——Bean的依赖注入
依赖注入在设计模式与IoC这篇文章中,介绍了Spring基础的三大支柱的两项内容——IoC.Bean.本篇将继续围绕着Bean的创建时的注入方式来介绍Spring的核心思想与设计模式. 天底下所有面向 ...
- spring中bean配置和注入场景分析
bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并 ...
- Spring 创建Bean的6种方式
前言 本文讲解了在Spring 应用中创建Bean的多种方式,包括自动创建,以及手动创建注入方式,实际开发中可以根据业务场景选择合适的方案. 方式1: 使用Spring XML方式配置,该方式用于在纯 ...
- Spring创建Bean的过程Debug
目录 Spring流程Debug 1.1 Spring测试环境搭建 1.2 Debug容器创建过程 1.3 AbstractApplicationContext的refresh()包含的13个方法分析 ...
随机推荐
- objective-c如何在linux下进入Modern模式
自从apple的obj-c进入2.0后,出现了相对于Legacy模式的Modern模式:Modern模式中出现了一些高级功能(比如ARC),并且出现了一些新的字面语法,新旧模式的差别可以参考apple ...
- android的服务分类-andrioid学习之旅(94)
摘自韩国棒子的书,android框架摘要 android服务类型分类,如下图: 对于本地服务,有两种类型,一中是绑定进行数据交流,一种是不绑定的,生命周期如下图:
- LeetCode之旅(19)-Power of Two
题目 Given an integer, write a function to determine if it is a power of two. Credits: Special thanks ...
- unix下对于字符串变量的各种操作总结
在unix like系统的shell中,提供了很多操作字符串变量的灵活语法,我们接下来依次来看一看. apple@kissAir: ~$path=$PATH apple@kissAir: ~$echo ...
- pyqt5 动画在QThread线程中无法运行问题
自己做了一个tcp工具,在学习动画的时候踩了坑,需求是根据上线变绿色,离线变灰色,如果连接断开了,则变为灰色 问题现象: 可以看到点击"连接","离线"的时候动 ...
- 3sum(从数组中找出三个数的和为0)
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- 并发编程(五):CAS
在atomic包中,大多数类都是借助unsafe类来实现的,如以下代码 public static AtomicInteger count = new AtomicInteger(0); privat ...
- JavaScript 很长很长的JS
var BaiduUsers = [], WechatUsers = []; var User = function(id, name, phone, gender, age, salary) { t ...
- 完美支持Py3的微信开发库推荐
之前分享了个代码,后来发现中文发送是乱码,应该是加密代码的问题,然后在又找到这个可完美使用的Py3微信库wechatpy:https://github.com/jxtech/wechatpy
- ffmpeg转换参数和压缩输出大小的比率 参考 最新版本FFMPEG
https://blog.cnlabs.NET/3668.html ffmpeg 转换压缩比例 FFMPEG如果是压缩为FLV文件 3个编码可选1. -c:v flv 标准FLV编码 这个好处是速度快 ...