基于XML配置Bean
通过类型获取bean通过指定构造器配置bean通过p名称空间配置bean通过ref配置bean通过内部bean配置属性对集合数组属性进行配置对List属性进行配置对Map属性进行配置对Set属性进行配置对Array属性进行配置对Properties属性进行配置
使用utillist进行配置属性级联赋值配置通过静态工厂获取beanbean配置信息重用bean创建顺序bean的单例和多实例bean的生命周期配置bean后置处理器通过属性文件配置bean基于XML的bean的自动装配Spring El 表达式配置Bean
上文中, 我们学习到了 Spring系列一:spring的安装与使用 接下来我们学习, 通过XML配置bean
依然是 Spring项目
Bean管理包括两方面: 创建bean对象, 给bean注入属性
通过类型获取bean
案例: 通过spring的ioc容器, 获取一个bean对象, 获取方式: 按类型.
1.src/beans.xml增加如下配置
2.com/zzw/spring/test/SpringBeanTest.java新增getBeanByType方法
//演示通过bean的类型获取对象
@Test
public void getBeanByType() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
//直接传入class对象/类型
Monster bean = ioc.getBean(Monster.class);
System.out.println("bean=" + bean);
}
细节 按照类型获取bean, 要求ioc容器中的同一个类的bean只能有一个, 否则会抛出异常 NoUniqueBeanDefinationException
这种方式的应用场景: 比如XxxAction / Servlet / Controller, 或XxxService在一个线程中只需要一个对象实例(单例)的情况
在容器配置文件(比如beans.xml)中给属性赋值. 底层是通过setter方法完成的. 所以需要提供setter方法.
通过指定构造器配置bean
1.src/beans.xml增加如下配置
2.com/zzw/spring/test/SpringBeanTest.java新增setBeanByConstructor方法
//演示通过构造器来设置属性
@Test
public void setBeanByConstructor() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Monster monster03 = ioc.getBean("monster03", Monster.class);
System.out.println("monster03=" + monster03);
}
3.在com.zzw.spring.bean.Monster中介绍方法重载 通过index属性来区分是第几个参数; 通过type属性来区分是什么类型(按照顺序, 这是可以的)
通过p名称空间配置bean
1.src/beans.xml增加如下配置
xmlns:p=“http://www.springframework.org/schema/p”
p:monsterId="400" p:name="天蓬元帅" p:skill="掌管十万天军" /> 2.com/zzw/spring/test/SpringBeanTest.java新增setBeanByP方法 public class SpringBeanTest { //演示通过p名称空间来设置属性 @Test public void setBeanByP() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Monster monster06 = ioc.getBean("monster06", Monster.class); System.out.println("monster06=" + monster06); } } 通过ref配置bean 引用注入其它bean对象 在spring的ioc容器, 可以通过ref来实现bean对象的相互引用[ref全称: reference] 1.src/beans.xml增加如下配置
2.新建com.zzw.spring.service.MemberServiceImpl
public class MemberServiceImpl {
private MemberDaoImpl memberDao;
public MemberDaoImpl getMemberDao() {
return memberDao;
}
public void setMemberDao(MemberDaoImpl memberDao) {
this.memberDao = memberDao;
}
public void add() {
System.out.println("MemberServiceImpl add方法被调用...");
memberDao.add();
}
}
3.新建com.zzw.spring.dao.MemberDaoImpl
public class MemberDaoImpl {
public MemberDaoImpl() {
System.out.println("MemberDaoImpl 构造器...");
}
public void add() {
System.out.println("MemberDaoImpl add方法被执行");
}
}
4.测试: com/zzw/spring/test/SpringBeanTest.java新增setBeanByRef方法
public class SpringBeanTest {
//通过ref来设置bean属性
@Test
public void setBeanByRef() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
MemberServiceImpl memberService = ioc.getBean("memberService", MemberServiceImpl.class);
memberService.add();
}
}
通过内部bean配置属性
引用/注入内部bean对象
在spring的ioc容器, 可以直接配置内部bean对象
1.src/beans.xml增加如下配置
2.com/zzw/spring/test/SpringBeanTest.java新增setBeanByPro方法
public class SpringBeanTest {
//通过内部bean, 设置属性
@Test
public void setBeanByPro() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
MemberServiceImpl memberService2 = ioc.getBean("memberService2", MemberServiceImpl.class);
memberService2.add();
}
}
对集合数组属性进行配置
●引用/注入 集合/数据类型 1.主要掌握List / Map / Properties 三种集合的使用 2.Properties是Hashtable的子类, 是key-value的形式 3.这里的properties的k-v, 都是String类型
需求: 在spring的ioc容器中, 如何给bean对象的 集合/数组 类型的属性赋值
●代码实现 1.新建com.zzw.spring.bean.Master
public class Master {
private String name;//主人名字
private List
private Map
private Set
//数组
private String[] monsterName;
//Java基础
//这个Properties 是HashMap的子类, 是key-value的存放形式
//这里Properties key和value 都是String
private Properties properties;
//getter, setter方法
}
对List属性进行配置
1.src/beans.xml增加如下配置
p:monsterId="300" p:name="狮驼岭" p:skill="紫金葫芦" />
2.测试: com/zzw/spring/test/SpringBeanTest.java新增setBeanByCollection方法
public class SpringBeanTest {
//给集合/数组属性进行赋值
@Test
public void setBeanByCollection() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Master master = ioc.getBean("master", Master.class);
System.out.println("master=" + master);
}
}
对Map属性进行配置
1.src/beans.xml增加如下配置
p:monsterId="300" p:name="狮驼岭" p:skill="紫金葫芦~" />
2.测试: com/zzw/spring/test/SpringBeanTest.java的setBeanByCollection方法
public class SpringBeanTest {
//给集合/数组属性进行赋值
@Test
public void setBeanByCollection() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Master master = ioc.getBean("master", Master.class);
System.out.println("master=" + master);
}
}
对Set属性进行配置
1.src/beans.xml增加如下配置
p:monsterId="300" p:name="狮驼岭" p:skill="紫金葫芦~" />
2.测试: com/zzw/spring/test/SpringBeanTest.java的setBeanByCollection方法
public class SpringBeanTest {
//给集合/数组属性进行赋值
@Test
public void setBeanByCollection() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Master master = ioc.getBean("master", Master.class);
System.out.println("master=" + master);
}
}
对Array属性进行配置
1.src/beans.xml增加如下配置
2.测试: com/zzw/spring/test/SpringBeanTest.java的setBeanByCollection方法
public class SpringBeanTest {
//给集合/数组属性进行赋值
@Test
public void setBeanByCollection() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Master master = ioc.getBean("master", Master.class);
System.out.println("master=" + master);
}
}
对Properties属性进行配置
1.src/beans.xml增加如下配置
2.测试: com/zzw/spring/test/SpringBeanTest.java的setBeanByCollection方法
public class SpringBeanTest {
//给集合/数组属性进行赋值
@Test
public void setBeanByCollection() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Master master = ioc.getBean("master", Master.class);
System.out.println("master=" + master);
}
}
使用utillist进行配置
spring的ioc容器, 可以通过util名称空间来创建list集合
1.新建com.zzw.spring.bean.BookStore
public class BookStore {
//书
private List
//无参构造器, 如果没有其它的构造器, 该无参构造器可以不写
//如果有其它的构造器, 则必须显示地定义一下无参构造器
public BookStore() {
}
//getter, setter方法
}
2.src/beans.xml增加如下配置
3.测试: com/zzw/spring/test/SpringBeanTest.java新增setBeanByUtilList方法
public class SpringBeanTest {
//使用util:list名称空间给属性赋值
@Test
public void setBeanByUtilList() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
BookStore bookStore = ioc.getBean("bookStore", BookStore.class);
System.out.println("bookStore=" + bookStore);
}
}
属性级联赋值配置
spring的ioc容器, 可以直接给对象属性的属性赋值, 即级联属性赋值
1.新增com.zzw.spring.bean.Dept部门类
public class Dept {
private String name;
public Dept() {
}
//getter, setter方法
2.新建com.zzw.spring.bean.Employee员工类
public class Employee {
private String name;
private Dept dept;
public Employee() {
}
//getter, setter方法
}
3.src/beans.xml增加如下配置
4.测试: com/zzw/spring/test/SpringBeanTest.java新增setBeanByRelation方法
public class SpringBeanTest {
//给属性进行级联赋值
@Test
public void setBeanByRelation() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Employee employee = ioc.getBean("employee", Employee.class);
System.out.println("employee=" + employee);
}
}
通过静态工厂获取bean
在spring的ioc容器, 可以通过静态工厂获取bean对象
1.新建com.zzw.spring.factory.MyStaticFactory 这是一个静态工厂类-可以返回Monster对象
package com.zzw.spring.factory;
public class MyStaticFactory {
private static Map
//使用static代码块进行初始化 - java基础
static {
monsterMap = new HashMap<>();
monsterMap.put("monster01", new Monster(100, "齐天大圣", "如意金箍棒"));
monsterMap.put("monster02", new Monster(200, "天蓬元帅", "九齿钉耙"));
}
//提供一个方法, 返回Monster对象
public static Monster getMonster(String key) {
return monsterMap.get(key);
}
}
2.src/beans.xml增加如下配置
factory-method="getMonster">
3.测试: com/zzw/spring/test/SpringBeanTest.java新增getBeanByStaticFactory方法
public class SpringBeanTest {
//通过静态工厂获取bean
@Test
public void getBeanByStaticFactory() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Monster myMonster01 = ioc.getBean("myMonster01", Monster.class);
Monster myMonster02 = ioc.getBean("myMonster01", Monster.class);
System.out.println("myMonster01=" + myMonster01);
System.out.println(myMonster01 == myMonster02);//true. myMonster01和myMonster02是同一个对象
}
}
bean配置信息重用
在spring的ioc容器, 提供了一种继承的方式来实现bean配置信息的重用
1.src/beans.xml增加如下配置
p:monsterId="10" p:name="蜘蛛侠" p:skill="吐丝" /> p:monsterId="12" p:name="蜘蛛侠~" p:skill="吐丝~" /> 2.测试: com/zzw/spring/test/SpringBeanTest.java新增getBeanByExtends方法 public class SpringBeanTest { //通过继承, 配置bean @Test public void getBeanByExtends() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Monster monster11 = ioc.getBean("monster11", Monster.class); System.out.println("monster11=" + monster11); Monster monster13 = ioc.getBean("monster13", Monster.class); System.out.println("monster13=" + monster13); } } bean创建顺序 在spring的ioc容器, 默认是按照配置的顺序创建bean对象 测试bean创建顺序 实验1 1.src/beans.xml增加如下配置 2.测试: com/zzw/spring/test/SpringBeanTest.java新增testBeanCreateOrder方法 public class SpringBeanTest { @Test public void testBeanCreateOrder() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); System.out.println("ok~"); } } 3.新增com.zzw.spring.bean.Department public class Department { public Department() { System.out.println("Department构造器 被执行"); } } 4.新增com.zzw.spring.bean.Student public class Student { public Student() { System.out.println("Student构造器 被执行"); } } ※提示: 会先创建student01这个bean对象, 然后创建department01这个bean对象 5.运行结果 Student构造器 被执行 Department构造器 被执行 ok~ ※如果这样配置, 会先创建department01对象, 再创建student01对象 6.运行结果 Department构造器 被执行 Student构造器 被执行 ok~ 实验2 1.先看下面的配置, 请问两个bean创建的顺序是什么? 并分析执行流程, src/beans.xml 2.答案: 先创建 id=memberDao再创建 id=memberService调用 memberService.setMemberDao() 完成引用 3.测试: com/zzw/spring/test/SpringBeanTest.java的testBeanCreateOrder方法 public class SpringBeanTest { @Test public void testBeanCreateOrder() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); System.out.println("ok~"); } } 4.运行结果: MemberDaoImpl 构造器... MemberServiceImpl 构造器被执行 setMemberDao()... 1.先看下面的配置, 请问两个bean创建的顺序是什么? 并分析执行流程, src/beans.xml
2答案:
先创建 id=memberService再创建 id=memberDao调用 memberService.setMemberDao() 完成引用
3.测试: com/zzw/spring/test/SpringBeanTest.java的testBeanCreateOrder方法
public class SpringBeanTest {
@Test
public void testBeanCreateOrder() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
System.out.println("ok~");
}
}
4.运行结果
MemberServiceImpl 构造器被执行
MemberDaoImpl 构造器...
setMemberDao()...
bean的单例和多实例
在spring的ioc容器中, 默认情况下是按照单例创建的. 即配置一个bean对象后, ioc容器只会创建一个bean对象 如果我们希望ioc容器配置的某个bean对象, 是以多个实例形式创建的. 则可以通过配置 scope=“prototype” 来指定
1.新建com.zzw.spring.bean.Cat
public class Cat {
private Integer id;
private String name;
public Cat() {
//getter, setter方法
}
2.src/beans.xml增加如下配置
3.测试: com/zzw/spring/test/SpringBeanTest.java增加testBeanScope方法
//测试Scope
@Test
public void testBeanScope() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Cat cat1 = ioc.getBean("cat", Cat.class);
Cat cat2 = ioc.getBean("cat", Cat.class);
Cat cat3 = ioc.getBean("cat", Cat.class);
System.out.println("cat1=" + cat1);
System.out.println("cat2=" + cat2);
System.out.println("cat3=" + cat3);
}
使用细节 1)bean默认是单例singleton; 在启动容器时, bean默认就会创建, 并放入到singletonObjects 2) 当
bean的生命周期
bean对象创建是由JVM完成的, 然后执行如下方法
执行构造器执行set相关方法调用bean的初始化方法(需要配置)使用bean当容器关闭的时候, 调用bean的销毁方法(需要配置)
●代码实现 1.新建com.zzw.spring.bean.House
public class House {
private String name;
public House() {
System.out.println("House构造器 被执行...");
}
public void setName(String name) {
System.out.println("House setName()=" + name);
this.name = name;
}
//解读
//1.这个方法是由程序员来编写的
//2.根据自己的业务逻辑来写.
//3.名字也不是固定的
public void init() {
System.out.println("House init()....");
}
//解读
//1.这个方法是由程序员来编写的
//2.根据自己的业务逻辑来写.
//3.名字也不是固定的
public void destroy() {
System.out.println("House destroy()...");
}
@Override
public String toString() {
return "House{" +
"name='" + name + '\'' +
'}';
}
}
2.配置src/beans.xml
init-method="init" destroy-method="destroy">
3.测试bean的生命周期com.zzw.spring.test.SpringBeanTest
public class SpringBeanTest {
@Test
public void testBeanLife() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
House house = ioc.getBean("house", House.class);
System.out.println("house=" + house);
//关闭容器
//1.ioc的编译类型 ApplicationContext, 运行类型 ClassPathXmlApplicationContext
//2.因为ClassPathXmlApplicationContext 实现了 ConfigurableApplicationContext
//3.ClassPathXmlApplicationContext 是有close()的
//4.将ioc 转成ClassPathXmlApplicationContext, 再调用close()
//ioc.close()
//5.关闭ioc容器
((ClassPathXmlApplicationContext) ioc).close();
}
}
4.输出
House构造器 被执行...
House setName()=上海豪宅
House init()....
setMemberDao()...
house=com.zzw.spring.bean.House@327bcebd
House destroy()...
使用细节 1.初始化-init方法和destroy方法, 由程序员来指定 2.销毁方法就是当关闭容器时, 才会被调用
配置bean后置处理器
1在spring的ioc容器, 可以配置bean的后置处理器
2.该 处理器/对象 会在bean初始化方法调用前和初始化方法调用后被调用
3.bean中没有声明初始化方法, 后置处理器依然会发生作用
4.程序员可以在后置处理器中编写自己的代码
●代码实现 1.新建com.zzw.spring.bean.MyBeanPostProcessor
//ctrl+h 可以查看类的继承关系
//这是一个后置处理器, 需要实现 BeanPostProcessor接口
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* 什么时候被调用: 在Bean的init方法前被调用
* @param bean 传入在ioc容器中 创建/配置 的bean
* @param beanName 传入在ioc容器中 创建/配置 的bean的id
* @return Object 是程序员对传入的bean进行修改/处理[如果有需要的话], 返回
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization()... bean="
+ bean + " beanName=" + beanName);
return bean;
}
/**
* 什么时候被调用: 在Bean的init方法后被调用
* @param bean 传入在ioc容器中 创建/配置 的bean
* @param beanName 传入在ioc容器中 创建/配置 的bean的id
* @return Object 是程序员对传入的bean进行修改/处理[如果有需要的话], 返回
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization()... bean="
+ bean + " beanName=" + beanName);
return bean;
}
}
2.新建src/beans02.xml配置文件
init-method="init" destroy-method="destroy">
3.测试com.zzw.spring.test.SpringBeanTest
public class SpringBeanTest {
@Test
public void testBeanPostProcessor() {
ApplicationContext ioc =
new ClassPathXmlApplicationContext("beans02.xml");
House house = ioc.getBean("house", House.class);
System.out.println("使用house=" + house);
//关闭容器
//ioc不能调用子类的特有的成员
//因为在编译阶段, 能调用哪些成员, 是由编译类型来决定的
//ioc编译类型 ApplicationContext, 运行类型 ClassPathXmlApplicationContext
((ClassPathXmlApplicationContext) ioc).close();//向下转型
}
}
其它说明 1.怎么执行到这个方法? => 使用AOP(反射+动态代理+IO+容器+注解) 2.有什么用? => 可以对IOC容器中所有的对象进行统一处理, 比如日志处理/权限校验/安全验证/事务管理. -初步体验案例: 如果类型是House的统一改成 上海豪宅 3.针对容器的所有对象吗? 是的=>切面编程 4.后面我们会自己实现这个底层机制 5.这是一个比较难以理解的知识点.
1.修改src/beans02.xml
init-method="init" destroy-method="destroy">
init-method="init" destroy-method="destroy">
2.修改com.zzw.spring.bean.MyBeanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization()... bean="
+ bean + " beanName=" + beanName);
//对多个对象进行处理/编程=>切面编程
if (bean instanceof House) {
((House) bean).setName("上海豪宅~");
}
//这里返回一个空值并不会有任何影响
//return null;
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization()... bean="
+ bean + " beanName=" + beanName);
return bean;
}
}
3.测试com.zzw.spring.test.SpringBeanTest
public class SpringBeanTest {
@Test
public void testBeanPostProcessor() {
ApplicationContext ioc =
new ClassPathXmlApplicationContext("beans02.xml");
House house = ioc.getBean("house", House.class);
House house02 = ioc.getBean("house02", House.class);
System.out.println("使用house=" + house);
System.out.println("使用house=" + house02);
//关闭容器
//ioc不能调用子类的特有的成员
//因为在编译阶段, 能调用哪些成员, 是由编译类型来决定的
//ioc编译类型 ApplicationContext, 运行类型 ClassPathXmlApplicationContext
((ClassPathXmlApplicationContext) ioc).close();//向下转型
}
}
4.测试结果(return bean和return null都是下面的输出结果), 这是由底层机制决定的
House构造器 被执行...
House setName()=大豪宅
postProcessBeforeInitialization()... bean=House{name='大豪宅'} beanName=house
House setName()=上海豪宅~
House init()....
postProcessAfterInitialization()... bean=House{name='上海豪宅~'} beanName=house
House构造器 被执行...
House setName()=宫殿
postProcessBeforeInitialization()... bean=House{name='宫殿'} beanName=house02
House setName()=上海豪宅~
House init()....
postProcessAfterInitialization()... bean=House{name='上海豪宅~'} beanName=house02
使用house=House{name='上海豪宅~'}
使用house=House{name='上海豪宅~'}
House destroy()...
House destroy()...
通过属性文件配置bean
在spring的ioc容器, 通过属性文件给bean注入值
1.新建src/my.properties [配置文件都要写在src目录下]
monsterId=1000
name=\u5343\u5e74\u9f9f
skill=\u65cb\u8f6c\u6253\u51fb
解决中文乱码问题
2.新建src/beans03.xml增加如下配置
3.测试: com/zzw/spring/test/SpringBeanTest.java增加setBeanByFile方法
public class SpringBeanTest {
//通过属性文件给bean属性赋值
@Test
public void setBeanByFile() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans03.xml");
Monster monster100 = ioc.getBean("monster100", Monster.class);
System.out.println("monster100=" + monster100);
}
}
基于XML的bean的自动装配
在spring的ioc容器, 可以实现自动装配bean
这里说的Action就是我们前面学习过的Servlet -> 充当Controller
1.新建com.zzw.spring.dao.OrderDao
public class OrderDao { //DAO类
public void saveOrder() {
System.out.println("保存一个订单....");
}
}
2.新建com.zzw.spring.service.OrderService
public class OrderService { //Service类
//OrderDao属性
private OrderDao orderDao;
//getter方法
public OrderDao getOrderDao() {
return orderDao;
}
//setter方法
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
}
3.新建com.zzw.spring.web.OrderAction
public class OrderAction { //Servlet就是Controller
//OrderService属性
private OrderService orderService;
//getter方法
public OrderService getOrderService() {
return orderService;
}
//setter方法
public void setOrderService(OrderService orderService) {
this.orderService = orderService;
}
}
4.src/beans03.xml增加如下配置
id="orderService"/> 5.测试: com/zzw/spring/test/SpringBeanTest.java增加setBeanByAutowire方法 //通过自动装配来对属性赋值 public class SpringBeanTest { @Test public void setBeanByAutowire() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans03.xml"); OrderAction orderAction = ioc.getBean("orderAction", OrderAction.class); //验证是否自动装配上OrderService System.out.println(orderAction.getOrderService()); //验证是否自动装配上OrderDao System.out.println(orderAction.getOrderService().getOrderDao()); } } 6.byName方式讲解, src/beans03.xml增加如下配置 id="orderService"/> 7.测试… Spring El 表达式配置Bean 1.Spring Expression Language, Spring表达式语言, 简称SpEL. 支持运行时查询并可以操作对象. 2.和EL表达式一样, SpEL根据JavaBean风格的getXxx(), setXxx()方法定义的属性访问对象 3.SpEL使用#{...}作为界定符, 所有在大括号中的字符都被认为是SpEL表达式 4.不是重点, 能看懂即可. ●代码实现 1.新建com.zzw.spring.bean.SpELBean public class SpELBean { private String name; private Monster monster; private String monsterName; private String crySound; private String bookName; private Double reuslt; public SpELBean() { } //普通方法, 返回字符串 public String cry(String crySound) { return "发出 " + " 的声音"; } //静态方法 返回字符串 public static String read(String bookName) { return "正在读" + bookName; } //getter方法, setter方法, toString方法 2.src/beans04.xml增加如下配置 p:monsterId="001" p:name="齐天大圣" p:skill="金箍棒" /> 3.测试: com/zzw/spring/test/SpringBeanTest.java增加setBeanBySpEl方法 public class SpringBeanTest { //通过spring el 对属性赋值 @Test public void setBeanBySpEl() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans04.xml"); SpELBean spELBean = ioc.getBean("spELBean", SpELBean.class); System.out.println("spELBean=" + spELBean); } } 4.测试结果 spELBean=SpELBean{name='赵志伟' monster=Monster{monsterId='1', name='齐天大圣', skill='金箍棒'} monsterName='齐天大圣' crySound='发出 小猫 的声音' bookName='正在读安乐传' reuslt=1863.3999999999999} 下一章节: Spring系列三:基于注解配置bean 好文阅读
发表评论