IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Bean的加载方式 -> 正文阅读

[Java知识库]Bean的加载方式

1.XML方式声明bean

<?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="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
	<!--声明第三方开发bean-->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
</beans>

2.XML+注解方式声明bean

<?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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	https://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="com.spring"/>
</beans>
@Service
public class BookServiceImpl implements BookService {
}

(1)使用@Bean定义第三方bean,并将所在类定义为配置类

@Configuration
public class DbConfig {
	@Bean
	public DruidDataSource getDataSource(){
		DruidDataSource ds = new DruidDataSource();
		return ds;
} }

(2)使用@Component及其衍生注解@Controller 、 @Service、 @Repository定义bean
注意:@Controller 、 @Service、 @Repository作用其实跟Component注解一样,只是给开发人员
看的,让我们能够便于分辨组件的作用。

3.注解方式声明配置类

(1)定义配置类

@ComponentScan({"com.spring.bean"})
public class SpringConfig3 {
	@Bean
	public DruidDataSource getDataSource(){
		DruidDataSource ds = new DruidDataSource();
		return ds;
} }

(2)使用AnnotationConfigApplicationContext加载配置类

public class App3 {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);
        String[] names = ctx.getBeanDefinitionNames();//定义所有bean的名字
        for (String name : names) {
            System.out.println(name);
        }  }  }

注意:使用AnnotationConfigApplicationContext加载一个配置类,这个配置类自己也会变成一个bean

扩展1——FactoryBean

初始化实现FactoryBean接口的类, 实现对bean加载到容器之前的批处理操作

public class BookFactoryBean implements FactoryBean<Book> {
	public Book getObject() throws Exception {
		Book book = new Book();
		// 造book对象之前,可以对book对象进行相关的初始化工作
		return book;//对象
}
	public Class<?> getObjectType() {
		return Book.class;//类型
} }
@ComponentScan({"com.spring.bean"})
public class SpringConfig3 {
@Bean
public BookFactoryBean book(){
	return new BookFactoryBean();
} }

扩展2——配置类中导入原始的配置文件(系统迁移)

(1)原始配置文件applicationContext-config.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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context 				 
       https://www.springframework.org/schema/context/spring-context.xsd">
    <!-- xml方式声明自己开发的bean -->
    <bean id="cat" class="com.spring.bean.Cat"></bean>
    <bean class="com.spring.bean.Dog"></bean>
    <!--    xml方式声明第三方开发的bean-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"></bean>
</beans>

(2)使用@ImportResource注解导入

@ImportResource("applicationContext-config.xml")
public class SpringConfig2 {
}

扩展3——proxyBeanMethods

proxyBean就相当于@Configuration配置类最终出来的对象是个代理对象,Methods就是去拿创建的bean
①proxyBeanMethods=true,我们在运行对应的方法的时候,这个方法曾经在spring容器中加载过bean,再调用这个方法,
就是从容器中拿那个bean,而不再重新创建
②proxyBeanMethods=false,使用当前@Configuration配置类的对象,去执行@Bean注解下的方法,每执行一次就重新
创建一个对象

@Configuration(proxyBeanMethods = false)
public class SpringConfig3 {
	@Bean
	public Book book(){
		return new Book();
} }
public class AppObject {
	public static void main(String[] args) {
		ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
		SpringConfig3 config = ctx.getBean("Config", Config.class);
		config.book();
		config.book();
}

4.使用@Import导入要注入的bean

此形式可以有效解耦,实现无侵入式编程,在spring技术底层及诸多框架的整合中大量使用

(1)被导入的bean无需使用注解声明为bean
public class Dog {
}
(2)导入要注入的bean对应的字节码

@Import(Dog.class)
public class SpringConfig4 {
}

注意:这种方法生成的bean的名称是全路径类名

扩展4——使用@Import注解还可以导入配置类

@Import({Dog.class,DbConfig.class})
public class SpringConfig {
}
@Configuration
public class DbConfig {
    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        return ds;
    } }

5.使用上下文对象在容器初始化完毕后注入bean

public class AppImport {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig5.class);
		ctx.register(Cat.class);
		String[] names = ctx.getBeanDefinitionNames();
		for (String name : names) {
			System.out.println(name);
} } }

6.导入实现了ImportSelector接口的类,实现对导入源的编程式处理

@Configuration
@Import(MyImportSelector.class)
public class SpringConfig6 {
}
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata metadata) {
//        各种条件的判定,判定完毕后,再决定是否装载指定的bean
//       metadata指的是使用import出现的位置
//        判定SpringConfig6是否有Configuration注解
        boolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Configuration");
        if (flag) {
            return new String[]{"com.spring.bean.Dog"};
        }
        return new String[]{"com.spring.bean.Cat"};
    }
}

bean的加载方式(七)

导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对
容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果
和第七种方法的ImportSelector很相似,不过它把bean的管理也开启了

@Configuration
@Import(MyRegistrar.class)
public class SpringConfig7 {
}
public class MyRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
        BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Dog.class).getBeanDefinition();
        registry.registerBeanDefinition("dog",beanDefinition);
    }
}

bean的加载方式(八)

导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean,
实现对容器中bean的最终裁定

public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
		BeanDefinition beanDefinition = BeanDefinitionBuilder
			.rootBeanDefinition(BookServiceImpl4.class)
			.getBeanDefinition();
			registry.registerBeanDefinition("bookService", beanDefinition);
} }
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:40:46  更:2022-10-31 11:42:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 9:32:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码