栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

四、IOC操作Bean管理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

四、IOC操作Bean管理

4. IOC操作Bean管理 4.1 IOC操作Bean管理的概念和方式

1、什么是Bean管理 ?

答:Bean管理指的是两个操作

​ ① Spring创建对象

​ ② Spring注入属性

2、Bean管理操作的两种方式

​ ① 基于xml配置文件方式

​ ② 基于注解方式实现

4.2 基于xml方式的IOC操作Bean管理 4.2.1 对象的创建

在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建

在 bean 标签有很多属性,介绍常用的属性

​ id 属性:唯一标识

​ class 属性:类全路径(包类路径)

创建对象时候,默认也是执行无参数构造方法完成对象创建

4.2.2 对象属性的注入

**DI(Dependency Injection)依赖注入:**就是注入属性

注入属性的常用方式:

① 通过property标签完成属性的注入--------需要相应的set方法、反射注入

② 通过constructor-arg标签--------需要有参数构造器

③ 自动装配(自动注入)bean标签中的autowire属性-------根据type或者name进行注入

④ p名称空间注入--------相当于导入工具类

Ⅰ、property标签的属性注入---------bean中要有相应set方法


	

name属性:成员变量的名称

value属性:注入的内容

ref属性:引入外部bean(对象)

注:class写的为实现类,而不是不能实例化的接口或者抽象类

Ⅱ、constructor-arg标签------bean中要有有参数构造器


	
    
    

name属性:属性名称

value属性:注入的内容

ref属性:引入外部bean

index属性:参数在构造器中的下标(从0)

Ⅲ、autowire自动装配

   	
    
        Javascript
        Java从入门到精通
        Sprint5框架
    
    
    
    
        
    
    
    

autowire为bean标签的属性

其取值可以为 byName通过名称(id)注入、byType通过类型注入

注:这里通过util名称空间,抽取出来list集合,可以发现,通过property标签与通过autowire自动注入可以达到相同的效果。

byName扫描bean与util标签中id值与其属性相同的进行注入

Ⅳ、p名称空间注入



    
    
    

在bean标签中添加 p:属性名 = 属性值 即可

4.2.3 注入特殊类型属性

Ⅰ、数组类型(Array)

 		
        
            
            
                javaSe
                数据库原理
            
        

property标签中用name属性指出要注入的属性,其内容用array或者list标签指出

array标签、list标签

**value标签:**指出要注入的值内容(value标签个数即为数组元素个数)

Ⅱ 、List集合类型

		
        
            
                张三
                3
            
        

property标签中使用list标签,可以向属性中注入list集合

value标签:集合中的内容


list标签中使用**ref标签**可以引入对象

Ⅲ、Map集合类型

		
        
            
                
                
            
        

property标签中使用map标签,可以向属性中注入map集合

entry标签

key属性:注入的键

value属性:注入的值(内容)

value-ref属性:可以引入对象

Ⅳ、set集合类型

		
        
            
                Mysql
                Redis
            
        

property标签中使用set标签,可以向属性中注入set集合

set标签中使用value标签即可注入内容

4.2.4 特殊值的注入

Ⅰ、空值的注入


 

使用null标签即可

Ⅱ、特殊符号的注入


 >]]>


两种方式:

① CD:即CDATA数据区

>]]>

② 使用转义字符:< ----< : >---->

4.2.5 对象的注入(两种方式)

① 注入内部bean

	
    
        
        
        
            
                
            
        
    

使用说明:其实就是在property标签中套bean标签

② 注入外部bean

	
    
        
        
        
    
    
        
    

**使用说明:**在注入bean外部写一个bean,设置其id值,在需要注入的bean中property标签中使用ref属性引用即可

注:特殊写法


    
    
    
    
    


    

**注意:**引入外部bean时,属性的注入可以在外部bean中进行,也可以在引入之后,使用property完成,方法为:


首先通过反射获取到Emp对象对应的getDept方法,调用获得dept属性对象,然后调用Dept类中的setDname方法,设置属性内容

4.3 FactoryBean的说明

① Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)

② **普通 bean:**在配置文件中定义 bean 类型就是返回类型

③ **工厂 bean:**在配置文件定义 bean 类型可以和返回类型不一样


public class MyBean implements FactoryBean {
 	//定义返回 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;
 	}
}

说明:bean实现FactoryBean接口,其中泛型参数即为要返回的类型

getBean获取到的实际上是这个bean类中,getObject方法所返回的那个类型。

如果将getObject写为一个泛型方法,即可使获取的类型多样化,而对象的创建使用工厂模式+反射即可

4.4 Bean的作用域

bean默认是单例对象,也可以设置为多实例

Ⅰ、单实例(默认情况)

Ⅱ、多实例

在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例

scope 属性值 第一个值 默认值,singleton,表示是单实例对象 第二个值 prototype,表示是多实例对象

Ⅲ、singleton与prototype的区别

    Singleton 单实例,prototype 多实例设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象 设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用 getBean 方法时候创建多实例对象
4.5 Bean的生命周期

生命周期:对象从创建到销毁的过程

4.5.1 普通情况bean生命周期

bean生命周期

(1)通过构造器创建 bean 实例(无参数构造)

(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)

(3)调用 bean 的初始化的方法(需要进行配置初始化的方法)

(4)bean 可以使用了(对象获取到了)

(5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

流程:无参数构造-----属性注入------初始化方法------获取对象-------销毁方法

例:bean生命周期的演示

注:流程如上,但是具体初始化和销毁执行哪个方法是通过配置决定的

public class Orders {
 	//无参数构造
	public Orders() {
 		System.out.println("第一步 执行无参数构造创建 bean 实例");
 	}
	private String oname;
 	public void setOname(String oname) {
 		this.oname = oname;
		 System.out.println("第二步 调用 set 方法设置属性值");
	}
 	//创建执行的初始化的方法
	public void initMethod() {
		 System.out.println("第三步 执行初始化的方法");
 	}
 	//创建执行的销毁的方法
 	public void destroyMethod() {
 		System.out.println("第五步 执行销毁的方法");
 	}
}

 

init-method属性:配置初始化方法

destory-method属性:配置销毁方法

测试与结果:

	@Test
	 public void testBean3() {
		// ApplicationContext context =
		// new ClassPathXmlApplicationContext("bean4.xml");
		ClassPathXmlApplicationContext context =
 					new ClassPathXmlApplicationContext("bean4.xml");
		Orders orders = context.getBean("orders", Orders.class);
		System.out.println("第四步 获取创建 bean 实例对象");
 		System.out.println(orders);
 		//手动让 bean 实例销毁
 		context.close();
 }

流程:首先执行的是构造器的构造方法实现对象的创建,其次调用相应的set方法完成对象属性的注入。然后执行初始化方法initMethod(),之后对象已经可以通过getBean()获取,销毁的话需要调用context对象的close()方法

4.5.2 配置后置处理器bean生命周期

(1)通过构造器创建 bean 实例(无参数构造)

(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)

(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization

(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)

(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization

(6)bean 可以使用了(对象获取到了)

(7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

例:

(1)创建类,实现接口 BeanPostProcessor,创建后置处理器
public class MyBeanPost implements BeanPostProcessor {
 	@Override
 	public Object postProcessBeforeInitialization(Object bean, String beanName) 
	throws BeansException {
		 System.out.println("在初始化之前执行的方法");
		 return bean;
	 }
 	@Override
 	public Object postProcessAfterInitialization(Object bean, String beanName) 
	throws BeansException {
 		System.out.println("在初始化之后执行的方法");
		return bean;
 	}
}

注:后置处理器需要实现BeanPostProcessor接口,通过其中的

postProcessBeforeInitialization(Object bean, String beanName)

postProcessAfterInitialization(Object bean, String beanName)

分别是初始化前和初始化后执行的处理方法,可以对传入其中的bean实例进行相应的处理。


后置处理器的配置只需要创建相应的后置处理器对象即可

4.6 基于注解方式的IOC操作Bean管理 4.6.1 什么是注解

(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)

(2)使用注解,注解作用在类上面,方法上面,属性上面

(3)使用注解目的:简化 xml 配置

4.6.2 常用注解

Ⅰ、对象创建

@Component

@Service ----------service层

@Controller -----web层

@Repository------dao层

注:四个注解的功能没有什么不同,只是可以通过名称区分不同的作用地点

Ⅱ、属性的注入

@Autowired:根据属性类型进行自动装配---------不需要set方法,已经封装

@Service
public class UserService {
 	//定义 dao 类型属性
	 //不需要添加 set 方法
	 //添加注入属性注解
 	@Autowired 
 	private UserDao userDao;
 	
 	public void add() {
 		System.out.println("service add.......");
	 	userDao.add();
	}
}

@Qualifier: 根据名称进行注入,需要搭配@Autowired使用

//定义 dao 类型属性
//不需要添加 set 方法
//添加注入属性注解
@Autowired //根据类型进行注入
@Qualifier(value = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;

@Resource:既可以按类型注入,也可以按属性名注入

//@Resource //根据类型进行注入
@Resource(name = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;

@Value:注入普通类型属性

@Value(value = "abc")
private String name;
4.6.3 组件扫描

Spring需要进行相应的配置,对指定位置的java源文件进行扫描,如果有满足条件的注解修饰的类,则创建其对象。


需要引入context名称空间

使用context:component-scan标签,其中base-package属性则是需要扫描的包的路径

两种配置方法:

Ⅰ、采用include-filter ,只扫描指定类型的注解,需要设置use-default-filters为false


 

Ⅱ、采用exclude-filter,默认扫描所有的注解,排除掉某些


 

4.6.4 完全注解开发

(1)创建配置类,替代 xml 配置文件

@Configuration //作为配置类,替代 xml 配置文件
@ComponentScan(basePackages = {"com.atguigu"})
public class SpringConfig {
}

@Configuration:将某个类作为配置类使用

@ComponentScan:设置扫描路径

​ basePackages:默认扫描的路径

​ useDefaultFilters是否扫描全部

​ excludeFilters

​ includeFilters

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737570.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号