【Spring系列】IOC操作bean管理(一)——bean管理实例详解
【Spring系列】IOC操作bean管理(二)——bean的生命周期、作用域
【Spring系列】IOC操作bean管理(三)——xml自动装配
【Spring系列】IOC操作bean管理(四)——引入外部属性文件
【Spring系列】IOC操作bean管理(五)——bean管理注解
一、Bean管理是什么
(1)Spring创建对象
(2)Spirng注入属性
二、Bean管理操作方式
(一)Bean管理xml
(1)基于xml创建对象
<!--例如:创建dao对象-->
<bean id="userDaoImpl" class="com.springlearn.dao.UserDaoImpl"></bean>
(2)基于xml注入属性
1)在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建;
2)bean标签常用属性:
- id属性:唯一标识
- class属性:类全路径(包类路径)
- scope属性:单例 singleton 多例 pototype (默认是单例)
3)创建对象时候,默认调用无参数构造方法完成对象创建;
① 使用set方法:
实体类:
public class Book {
private String bname;
private String bauthor;
public void setBname(String bname) {
this.bname = bname;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
}
原始方法:
public class Main {
@Resource
public static void main(String[] args) {
Book book = new Book();
book.setBname("");
book.setBauthor("");
}
}
使用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">
<!--使用set方法注入属性-->
<bean id="book" class="com.springlearn.entity.Book">
<!--使用property完成属性注入
name:类里面属性名称
value:向属性注入的值
-->
<property name="bname" value="Spring学习"></property>
<property name="bauthor" value="肥宅快乐鼠"></property>
</bean>
</beans>
②使用有参构造:
实体类:
public class Order {
private String oid;
private String oname;
//生成有参构造
public Order(String oid, String oname) {
this.oid = oid;
this.oname = oname;
}
}
原始方法:
public class Main {
public static void main(String[] args) {
Order order = new Order("", "");
}
}
使用有参构造:
无需原始方法
<?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>
<!--使用有参构造方法注入属性-->
<bean id="order" class="com.springlearn.entity.Order">
<constructor-arg name="oid" value="123"></constructor-arg>
<constructor-arg name="oname" value="书本"></constructor-arg>
</bean>
</beans>
③ 使用p名称空间:
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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="book" class="com.springlearn.entity.Book" p:bname="课本" p:bauthor="肥宅快乐鼠"></bean>
</beans>
(3)基于xml注入其他类型属性
1)注入null或特殊符号
1:如果有null值
<null/>
<bean id="book" class="com.springlearn.entity.Book">
<property name="bname" value="Spring学习"></property>
<property name="bauthor">
<null/>
</property>
</bean>
2:如果包含特殊符号
<value><![CDATA[特殊符号属性]]></value>
或
转义 < >
<property name="address">
<value><![CDATA[<<spring学习>>]]></value>
</property>
2)注入外部bean(注入对象类型属性)
- 创建对象
(1)创建两个类 service类和dao接口和实现类
UserDao:
public interface UserDao {
public void addUser();
}
UserDaoImpl:
public class UserDaoImpl implements UserDao{
@Override
public void addUser() {
System.out.println("UserDao类的addUser方法……");
}
}
(2)在spring配置文件中进行配置
其实底层也是使用了set方法
UserService:
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addUserService(){
}
}
<?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">
<!--创建service对象-->
<bean id="userService" class="com.springlearn.service.UserService">
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<!--创建dao对象-->
<bean id="userDaoImpl" class="com.springlearn.dao.UserDaoImpl"></bean>
</beans>
(3)在service调用dao里面的方法
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addUserService(){
userDao.addUser();
}
}
3)注入内部bean
第一种:普通写法
- 管理对象之间关系
(1)创建实体类
public class Emp {
private String eno;
private String ename;
//表示所属部门
private Dept dept;
public String getEno() {
return eno;
}
public void setEno(String eno) {
this.eno = eno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp{" +
"eno='" + eno + '\'' +
", ename='" + ename + '\'' +
", dept=" + dept +
'}';
}
public void prints(){
System.out.println(eno +"——"+ename+"——"+dept);
}
}
public class Dept {
private String dname;
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
(2)在spring配置文件中进行配置
name属性:实体类中属性的名称
ref属性:bean标签的id值
<?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="emp" class="com.springlearn.entity.Emp">
<!--设置普通属性-->
<property name="eno" value="123"></property>
<property name="ename" value="jack"></property>
<!--级联赋值-->
<!--设置员工所属部门-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.springlearn.entity.Dept">
<property name="dname" value="技术部"></property>
</bean>
</beans>
(3)测试类
public class TestSpring {
@Test
public void testEmp(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Emp emp = context.getBean("emp", Emp.class);
emp.prints();
}
}
结果:
第二种:将对象写在属性标签里面
只是xml文件不同,这种是将bean标签写在property标签里面,来设置对象的属性。
<?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="emp" class="com.springlearn.entity.Emp">
<!--设置两个普通属性-->
<property name="eno" value="rose"></property>
<property name="ename" value="456"></property>
<!--设置对象类型属性-->
<property name="dept">
<bean id="dept" class="com.springlearn.entity.Dept">
<property name="dname" value="设计部"></property>
</bean>
</property>
</bean>
</beans>
结果:
第三种:级联赋值
注意: 需要生成级联赋值对象的get方法,因为要先得到对象之后才能赋值。
<?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="emp" class="com.springlearn.entity.Emp">
<!--设置两个普通属性-->
<property name="ename" value="lucy"></property>
<property name="eno" value="789"></property>
<!--级联赋值-->
<!--先创建对象-->
<property name="dept" ref="dept"></property>
<!--再注入属性-->
<property name="dept.dname" value="宣传部"></property>
</bean>
<bean id="dept" class="com.springlearn.entity.Dept"></bean>
</beans>
结果:
4)注入集合
实体类:
- 创建类,定义数组、list、map、set类型属性,生成对应set方法;
package com.springlearn.entity;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class CollectionEntity {
//数组类型
private String[] arrs;
//list
private List<String> lists;
//map
private Map<String,String> maps;
//set
private Set<String> sets;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
public void prints(){
System.out.println(Arrays.toString(arrs));
System.out.println(lists);
System.out.println(maps);
System.out.println(sets);
}
}
xml文件:
- 在spring配置文件进行配置;
<?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="collection" class="com.springlearn.entity.CollectionEntity">
<!--注入数组-->
<property name="arrs">
<array>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</array>
</property>
<!--注入list-->
<!--也可以使用array标签-->
<property name="lists">
<list>
<value>好好</value>
<value>学习</value>
</list>
</property>
<!--注入set-->
<property name="sets">
<set>
<value>天天</value>
<value>向上</value>
</set>
</property>
<!--注入map-->
<!--使用key-ref属性 可以引入其他对象-->
<property name="maps">
<map>
<entry key="yy" value="永远"></entry>
<entry key="ds" value="的神"></entry>
</map>
</property>
</bean>
</beans>
测试类:
package com.springlearn.test;
import com.springlearn.entity.CollectionEntity;
import com.springlearn.entity.Emp;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring {
@Test
public void testCollection(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
CollectionEntity collection = context.getBean("collection", CollectionEntity.class);
collection.prints();
}
}
结果:
三、FactoryBean
- Spring有两种类型bean
- 1:普通bean
- 2:工厂bean(FactoryBean)
(1)区别:
1、普通bean:在配置文件中定义bean类型就是返回类型;
3、工厂bean:在配置文件定义bean类型可以和返回类型不同(也可以相同);
(2)实现步骤
第一步:创建类,让这个类作为工厂bean,实现接口 FactoryBean
public class MyBean implements FactoryBean<Course> {
}
第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型
public class MyBean implements FactoryBean<Course> {
//定义返回bean
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("abc");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return false;
}
}
第三步:配置xml文件
<bean id="myBean" class="com.springlearn.factorybean.MyBean">
</bean>
第四步:编写测试类
@Test
public void test3() {
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Course course = context.getBean("myBean", Course.class);
System.out.println(course);
}
感谢阅读哇~