title: 【初识Spring】对象(Bean)实例化及属性注入(xml方式)

date: 2018-08-29 17:35:15

tags: [Java,Web,Spring]

#初识Spring之Bean实例化及属性注入

1.通过xml配置的方式进行实例化。

  • 配置文件中bean标签的常用属性
  • 通过无参构造(常用)
  • 使用静态工厂进行创建
  • 使用实例工厂进行创建

2.属性注入。

  • 使用有参数构造方法注入属性
  • 使用set方法注入属性(常用)
  • 注入对象类型属性
  • 注入复杂类型属性

xml配置的方式进行实例化

  • 配置文件中bean标签的属性

(1)id属性:起名称,id属性值名称任意命名

  • id属性值,不能包含特殊符号
  • 根据id值得到配置对象

(2)class属性:创建对象所在类的全路径

(3)name属性:功能和id属性一样的,id属性值不能包含特殊符号,但是在name属性值里面可以包含特殊符号

(4)scope属性

  • singleton:默认值,单例

  • prototype:多例

  • 无参构造实例化对象

//phone类:
package com.test.vo;
public class Phone {
public void printTest() {
System.out.print("Phone.......");
}
}
<!--applicationContext.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.xsd">
<bean id="phone" class="com.test.vo.Phone"></bean>
</beans>
//测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test {
public static void main(String[] args) {
//加载配置文件,创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//得到配置创建的对象
Phone Phone = (Phone) context.getBean("phone");
//调用对象方法
Phone.printTest();
}
}

注:java类中默认有无参构造方法,若类中已声明了有参构造,则需手动声明无参构造方法。

  • 使用静态工厂进行创建
//静态工厂类
package com.test.utils;
import com.test.vo.Phone; public class BeanFactory {
//静态方法,返回Phone对象
public static Phone getPhone() {
return new Phone();
} }
//创建的对象为Phone类对象不变
//配置文件改为:
<!--applicationContext.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.xsd">
<!--class为静态工厂的路径,factory-method为工厂的方法-->
<bean id="phoneFa" class="com.test.utils.BeanFactory" factory-method="getPhone"></bean>
</beans>
//测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Phone Phone = (Phone) context.getBean("phoneFa");
Phone.printTest();
}
}
  • 使用实例工厂进行创建
//实列工厂类:
import com.test.vo.Phone; public class BeanUFactory {
//普通方法,返回Phone对象
public Phone getPhone() {
return new Phone();
}
}
	配置文件修改:
<!-- 1.先创建工厂对象 -->
<!-- 2.再创建Phone对象 -->
<bean id="BeanUFactory" class="com.test.utils.BeanUFactory"></bean>
<bean id="phoneUFa" factory-bean="BeanUFactory" factory-method="getPhone"></bean>
//测试类:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Phone Phone = (Phone) context.getBean("phoneUFa");
Phone.printTest();
}
}

属性注入

  • 使用有参数构造方法注入属性:

Phone类改写为:

public class Phone {
private String name;
//显示声明无参构造
public Phone() {}
//有参构造
public Phone(String name) {
this.name=name;
}
public void printTest() {
System.out.print(name+"Phone.......");
}
}

applicationContext.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.xsd">
<!--class为静态工厂的路径,factory-method为工厂的方法-->
<bean id="phoneFa" class="com.test.utils.BeanFactory" factory-method="getPhone">
<!--name为构造方法的参数名,value为要将其设置的值-->
<constructor-arg name="name" value="诺基亚"></constructor-arg>
</bean>
</beans>

测试类:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Phone Phone = (Phone) context.getBean("phoneFa");
Phone.printTest();
}
}

结果:

诺基亚Phone.......
  • 使用set方法注入属性:

Phone类改写为:

public class Phone {
private String name;
//set方法
public void setName(String name) {
this.name = name;
}
public void printTest() {
System.out.print(name+"Phone.......");
}
}

applicationContext.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.xsd">
<!--class为静态工厂的路径,factory-method为工厂的方法-->
<bean id="phoneFa" class="com.test.utils.BeanFactory" factory-method="getPhone">
<!--name为要注入的属性的名称,value为要将其设置的值-->
<property name="name" value="三星"></property>
</bean>
</beans>

结果:

三星Phone.......
  • 注入对象类型属性

新建Person类:

public class Person {
private String name;
private String sex;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}

Phone类修改为:

package com.test.vo;

public class Phone {
private String name;
private Person person; //set方法
public void setName(String name) {
this.name = name;
} public void setPerson(Person person) {
this.person = person;
} public void printTest() {
System.out.print(person.getName()+"::"+person.getAge()+"::"+person.getSex());
}
}

配置文件作如下修改:

<?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="person" class="com.test.vo.Person" scope="prototype">
<property name="name" value="小王"></property>
<property name="sex" value="man"></property>
<property name="age" value="11"></property>
</bean>
<bean id="phone" class="com.test.vo.Phone">
<!-- 因注入的是对象写ref属性 -->
<property name="person" ref="person"></property>
</bean>
</beans>

测试方法不变,结果为:

小王::11::man
  • 注入复杂类型属性

Phone类修改为:

package com.test.vo;

import java.util.Arrays;
import java.util.List;
import java.util.Map; public class Phone {
private String arr[];
private List<Integer> list;
private Map<String,String> map; //set方法
public void setArr(String[] arr) {
this.arr = arr;
} public void setList(List<Integer> list) {
this.list = list;
} public void setMap(Map<String, String> map) {
this.map = map;
}
public void printTest() {
System.out.println("arr:"+Arrays.toString(arr));
System.out.println("list:"+list);
System.out.println("map:"+map);
}
}

配置文件作如下修改:

<?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="phone" class="com.test.vo.Phone">
<!-- 数组 -->
<property name="arr">
<list>
<value>小米</value>
<value>中兴</value>
<value>华为</value>
</list>
</property>
<!-- list集合 -->
<property name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<!-- map集合 -->
<property name="map">
<map>
<entry key="aa" value="lucy"></entry>
<entry key="bb" value="bob"></entry>
<entry key="cc" value="jerry"></entry>
</map>
</property>
</bean>
</beans>

结果如下:

arr:[小米, 中兴, 华为]
list:[1, 2, 3]
map:{aa=lucy, bb=bob, cc=jerry}

【初识Spring】对象(Bean)实例化及属性注入(xml方式)的更多相关文章

  1. spring中bean实例化时机以及整个运转方式

    接上一篇文章,一般在servlet获取到请求之后 在service方法中就可以完成所有的请求处理以及返回,但是我们会采用更高级的MVC框架来做.也就是说所有的MVC框架入口就是serlvet中的ser ...

  2. 【初识Spring】对象(Bean)实例化及属性注入(注解方式)

    通过xml的方式进行对象的实列化或属性注入或许有一些繁琐,所以在开发中常用的方式更多是通过注解的方式实现对象实例化和属性注入的. 开始之前 1.导入相关的包(除了导入基本的包还要导入aop的包): 创 ...

  3. 这一次搞懂Spring的Bean实例化原理

    文章目录 前言 正文 环境准备 两个重要的Processor 注册BeanPostProcessor对象 Bean对象的创建 createBeanInstance addSingletonFactor ...

  4. spring中bean的作用域属性singleton与prototype的区别

    1.singleton 当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会 ...

  5. Spring中bean的四种注入方式

    一.前言   最近在复习Spring的相关内容,这篇博客就来记录一下Spring为bean的属性注入值的四种方式.这篇博客主要讲解在xml文件中,如何为bean的属性注入值,最后也会简单提一下使用注解 ...

  6. Spring中bean标签的属性和值:

    Spring中bean标签的属性和值: <bean name="user" class="com.pojo.User" init-method=" ...

  7. Spring声明式事务管理(基于XML方式实现)

    --------------------siwuxie095                             Spring 声明式事务管理(基于 XML 方式实现)         以转账为例 ...

  8. Spring IoC(一)bean实例化和依赖注入

    1.IoC容器概述 IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入. 所谓 IOC ,就 ...

  9. Spring中bean实例化的三种方式

    之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例).那么今天我想来说说如何通过xml配 ...

随机推荐

  1. .net4.0使用Dapper操作MySql

    准备使用Dapper操作MySql,由于电脑只有vs2010,所以需要Dapper和MySql组件支持.net 4.0.经过一番测试,终于弄出一个DEMO. 1.操作MySql需要用MySql.Dat ...

  2. 简易用户管理系统-前端实现(表单&提交请求&button$基础)

    laravel框架编写简易用户管理系统,前端Layui框架. 1.动态生成列表项 实现效果 PHP后台传入用户对象($users). 前端页面接收数据传入table. 逻辑就是在生成表格时,遍历传来的 ...

  3. FOLDER

    一.建noTab的Folder Form:1.创建数据库对象:  create table  和相应的view. 2.基于模板Template.fmb创建一个新的Form:****.fmb  添加一个 ...

  4. emacs c/c++ 中使用的命令大杂烩

    emacs c/c++ 中使用的命令大杂烩 注释,缩进,光标移动等 键盘操作 键盘操作对应函数名 说明 ESC Ctrl \ indent-region 对光标和标记之间的每行文本进行缩进 ESC ; ...

  5. [Go] gocron源码阅读-flag包实现命令行参数获取

    调用flag包可以方便的获取到命令行中传递的参数,比如可以实现类似nginx执行程序获取命令行参数执行不同操作的目标 package main import ( "flag" &q ...

  6. [PHP] 内部接口简单加密验证方式

    1. 当有内部系统之间进行调用的时候,也需要简单的进行一下调用方的验证,一种简单的内部接口加密验证方式.此加密方式需要三个参数,分别是api地址,pin码,entry标识,其中pin和entry是接口 ...

  7. 第一周-调用weka算法进行数据挖掘

    第一周-调用weka算法进行数据挖掘 简单数据集data.txt @relation weather @attribute outlook {sunny, overcast, rainy} @attr ...

  8. NN tutorials:

    确实“人话”解释清楚了 ^_^ 池化不只有减少参数的作用,还可以: 不变性,更关注是否存在某些特征而不是特征具体的位置.可以看作加了一个很强的先验,让学到的特征要能容忍一些的变化.防止过拟合,提高模型 ...

  9. 浅谈C++ STL vector 容器

    浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...

  10. postman(十二):发送携带md5签名、随机数等参数的请求

    想起来之前在借助百度翻译接口做翻译小工具的时候,需要把参数进行md5加密后再传输. 而在平时的接口测试工作中难免会遇到类似这种请求参数,比如md5加密.时间戳.随机数等等.固然可以先计算出准确的参数, ...