spring有两种方法定义bean,一种是使用xml标签,一种是注解。在这里介绍使用xml标签定义bean。
我的文件目录如上图所示,在这里创建了bean.xml文件,bean.xml文件中定义了bean。
文件内容:
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。设置属性property,绑定对应的方法"setUserDaoTest" -->
<bean id="userService01" class="com.itheima.service.impl.UserServiceImpl">
<!-- 属性property表示bean中的方法。
字段name绑定bean中的方法setUserDaoTest,注意字段name的值是"删除set的UserDaoTest",格式为"userDao"。
第一个字符必须小写,其余不变。
字段ref绑定bean。值是bean的字段id值,即bean"com.itheima.dao.impl.UserDaoImpl"。
-->
<property name="userDaoTest" ref="userDao"></property>
</bean>
<!-- 字段name是bean的别名,功能类似字段id。其余bean可以通过id、name获取该bean。注意id的优先级高于name。 -->
<bean id="userDao"
name="aaa,bbb"
class="com.itheima.dao.impl.UserDaoImpl">
</bean>
</beans>
文件中定义了2个bean,一个是"com.itheima.dao.impl.UserDaoImpl",通过字段id"userDao"调用;一个是"com.itheima.service.impl.UserServiceImpl",通过字段id"userService"调用。
bean"userDao"
测试代码:
java
package com.itheima.test;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import com.itheima.dao.UserDao;
import com.itheima.service.UserService;
/**
* @copyright 2003-2024
* @author qiao wei
* @date 2024-07-09
* @version 1.0
* @brief
* @history name
* date
* brief
*/
public class BeanFactoryTest {
public static void main(String[] args) {
/**
* 1:创建工厂对象
* 2:创建读取器,读取xml文件。
* 3:读取配置文件,传递给工厂。
* 4:根据id获取Bean对象。
*/
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("beans.xml");
UserService userService = (UserService) beanFactory.getBean("userService01");
System.out.println(userService);
UserDao userDao = (UserDao) beanFactory.getBean("userDao");
System.out.println(userDao);
}
}
使用方法getBean,通过bean的字段id获取实例对象。注意bean实例userDao和userService01的定义区别,userService01通过属性property绑定方法setUserDaoTest,方法参数为UserDao实例。userDao没有设置属性property,没有绑定方法。
接口UserDao:
java
package com.itheima.dao;
/**
* @copyright 2003-2024
* @author qiao wei
* @date 2024-07-16
* @version 1.0
* @brief
* @history name
* date
* brief
*/
public interface UserDao {
}
接口UserService:
java
package com.itheima.service;
/**
* @copyright 2003-2024
* @author qiao wei
* @date 2024-07-05
* @version 1.0
* @brief
* @history name
* date
* brief
*/
public interface UserService {
}
实现类UserServiceImpl:
java
package com.itheima.service.impl;
import org.springframework.beans.factory.InitializingBean;
import com.itheima.dao.UserDao;
import com.itheima.service.UserService;
/**
* @copyright 2003-2024
* @author qiao wei
* @date 2024-07-09
* @version 1.0
* @brief
* @history name
* date
* brief
*/
public class UserServiceImpl implements UserService {
public UserServiceImpl() {
System.out.println("=============调用UserServiceImpl构造函数================");
}
/**
* @author qiao wei
* @brief 传入接口UserDao实例。该方法与xml中bean中的property的字段name绑定,绑定时去掉"set","UserDaoTest"首字
* 母"U"改成小写"u"。
* @param
* @return
* @throws
* @history name
* date
* brief
*/
public void setUserDaoTest(UserDao userDao) {
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@调用方法setUserDaoTest");
System.out.println(userDao);
}
public void setUserDao111(UserDao userDao) {
System.out.println("调用方法setUserDao111>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println(userDao);
}
}
运行结果如下:
XML
实例化UserDaoImpl$$$$$$$$$$$$$$$$$$$$$$$$
com.itheima.dao.impl.UserDaoImpl@6f195bc3
接口UserService:
java
package com.itheima.service;
/**
* @copyright 2003-2024
* @author qiao wei
* @date 2024-07-05
* @version 1.0
* @brief
* @history name
* date
* brief
*/
public interface UserService {
}
接口UserService实现,UserServiceImpl:
java
package com.itheima.service.impl;
import com.itheima.dao.UserDao;
import com.itheima.service.UserService;
/**
* @copyright 2003-2024
* @author qiao wei
* @date 2024-07-09
* @version 1.0
* @brief
* @history name
* date
* brief
*/
public class UserServiceImpl implements UserService {
public UserServiceImpl() {
System.out.println("=============调用UserServiceImpl构造函数================");
}
/**
* @author qiao wei
* @brief 传入接口UserDao实例。该方法与xml中bean中的property的字段name绑定,绑定时去掉"set","UserDaoTest"首字
* 母"U"改成小写"u"。
* @param
* @return
* @throws
* @history name
* date
* brief
*/
public void setUserDaoTest(UserDao userDao) {
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@调用方法setUserDaoTest");
System.out.println(userDao);
}
public void setUserDao111(UserDao userDao) {
System.out.println("调用方法setUserDao111>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println(userDao);
}
}
运行结果:
XML
=============调用UserServiceImpl构造函数================
实例化UserDaoImpl$$$$$$$$$$$$$$$$$$$$$$$$
@@@@@@@@@@@@@@@@@@@@@@@@@调用方法setUserDaoTest
com.itheima.dao.impl.UserDaoImpl@de3a06f
com.itheima.service.impl.UserServiceImpl@76b10754