spring02-组件注册[email protected]自动扫描组件&指定扫描规则

上一篇我们讲到,讲@Bean注解标在某个方法上,那么ioc容器启动的时候就会将方法返回值放到ioc容器中

在开发中,实际上包扫描用的比较多,接下来我们会介绍两种方式一种是基于xml,一种是基于注解。

咱们先来xml的形式进行包扫描

这里我用的是spring suit tool 版本的eclipse,专门开发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"
	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 http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<!-- class = "",输入person alt+/ 会提示 -->
	<bean id = "person" class="com.liuyuan.bean.Person"></bean>

	<bean id = "person2" class ="com.liuyuan.bean.Person">
	<!-- 这里的name="",也可以使用快捷键alt+/ -->
		<property name="age" value="18"></property>
		<property name="name" value = "zhangsan"></property>
	</bean>
	<!-- 包扫描,只要标注了@Controller,@Service,@Component,@Repository就会被扫描,加进ioc容器 -->
	<context:component-scan base-package="com.liuyuan"></context:component-scan>

</beans>

对于注解形式

加了@ComponentScan(value= "com.liuyuan")

package com.liuyuan.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.liuyuan.bean.Person;

//配置类等同于之前的配置文件
@Configuration  //告诉spring这是一个配置类
@ComponentScan(value= "com.liuyuan")
public class MainConfig {
	//给容器注册一个Bean,类型为返回值得类型,
	///id默认是以方法名作为id
	@Bean("AAA")
	public Person person() {
		return new Person("lisi",20);
	}
}

建了com.liuyuan.dao,com.liuyuan.service,com.liuyuan.controller 这些包,里面对应的建了BookDao,BookService,BookControler,在这三个类上面加了注解,@Repository,@Service,@Controller

注解,完了建立一个测试类

package com.liuyuan.test;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.liuyuan.config.MainConfig;

public class IOCTest {
	@SuppressWarnings("resource")
	@Test
	public void test01() {
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
		String [] definitionNames = applicationContext.getBeanDefinitionNames();
		for (String name : definitionNames) {
			System.out.println(name);
		}
	}
}

这些Bean都是类名第一位小写

那个mainConfig为什么有呢?因为@Configration注解,可以点进去看一下

接下来我们定一些包扫描规则

比如排除一部分Bean

@ComponentScan(value= "com.liuyuan",excludeFilters = {
                                @Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
})

这个 filter实际上是一个数组,可以写多个,并且可以指定过滤的形式

package com.liuyuan.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;

import com.liuyuan.bean.Person;
import com.liuyuan.service.BookService;

//配置类等同于之前的配置文件
@Configuration  //告诉spring这是一个配置类
@ComponentScan(value= "com.liuyuan",excludeFilters = {
								@Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
})
public class MainConfig {
	//给容器注册一个Bean,类型为返回值得类型,
	///id默认是以方法名作为id
	@Bean("AAA")
	public Person person() {
		return new Person("lisi",20);
	}
}

再次启动测试类,发现bookController真的被排除了

接下来再来一个包含某些进行扫描的定义规则

还记得在xml里面配置的时候需要禁用掉默认的过滤规则

加个use-default-filters="true"

如下

<?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 http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<!-- class = "",输入person alt+/ 会提示 -->
	<bean id = "person" class="com.liuyuan.bean.Person"></bean>

	<bean id = "person2" class ="com.liuyuan.bean.Person">
	<!-- 这里的name="",也可以使用快捷键alt+/ -->
		<property name="age" value="18"></property>
		<property name="name" value = "zhangsan"></property>
	</bean>
	<!-- 包扫描,只要标注了@Controller,@Service,@Component,@Repository就会被扫描,加进ioc容器use-default-filters="false"
	只包含某些需要禁用掉默认的过滤规则,只包含啊才能生效-->
	<context:component-scan base-package="com.liuyuan" use-default-filters="false"></context:component-scan>

</beans>

对于注解形式的

package com.liuyuan.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;

import com.liuyuan.bean.Person;
import com.liuyuan.service.BookService;

//配置类等同于之前的配置文件
@Configuration  //告诉spring这是一个配置类
@ComponentScan(value= "com.liuyuan",/*excludeFilters = {
								@Filter(type=FilterType.ANNOTATION,classes={Controller.class})*/
includeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})
},useDefaultFilters=false)
public class MainConfig {
	//给容器注册一个Bean,类型为返回值得类型,
	///id默认是以方法名作为id
	@Bean("AAA")
	public Person person() {
		return new Person("lisi",20);
	}
}

对于mainCofig已经看到@Component注解,Bean也看下吧

查看确实是没有,为什么会被spring 的ioc管理呢?

留个疑问吧

来源:淮安网站优化

原文地址:https://www.cnblogs.com/1994july/p/12080416.html

时间: 2024-11-10 16:02:46

spring02-组件注册[email protected]自动扫描组件&指定扫描规则的相关文章

Spring 通过注解定义Bean以及自动扫描注解定义的bean ComponentScan 自动扫描组件&amp;指定扫描规则

不管是xml还是注解,他们都是表达bean定义的载体,其实质都是为Spring容器提供Bean定义的信息,在表现形式上都是讲xml定义的内容通过类注解进行描述. Spring容器成功启动的三大要件分别为:bean定义信息,bean实现类,spring本身. 如果采用基于xml的配置,则bean定义信息和bean实现类本身是分离的:而如果采用基于注解的配置文件,则bean定义信息通过在bean实现类上标注注解实现. @Controller:用于对Controller实现类进行标注 @Reposit

iview国际化问题(iview官方提供的兼容[email&#160;protected]+使用组件报错)

问题描述: 按照iview官方的说法配置i18n发现在使用组件的时候会报错. 兼容 [email protected]+的配置如下图 报错如下图 解决方法: 经过参考element-ui的国际化配置终于解决问题. 解决方法如下图 原文地址:https://www.cnblogs.com/guojikun/p/9146084.html

spring注解之组件注册

1.组件注册是什么? spring组件有十几种,但核心的只有三个:Context.Core和Bean. 那么这三个组件的关系是什么呢? -Context:容器 -Core :关系 -bean:实物 -一句话:在springIOC运行容器(Context)中,通过Core建立维护各个bean之间的关系. 我们所说的组件注册其实就是:把bean对象交给ioc容器管理 2.组件注册几种方式: [email protected]给容器注册组件 @Configuration public class My

【spring 注解驱动开发】组件注册

组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫描规则 3.自定义TypeFilter指定过滤规则 4.@Scope-设置组件作用域 5.@Lazy-bean懒加载 6.@Conditional-按照条件注册bean 7.@Import-给容器中快速导入一个组件 8.@Import-使用ImportSelector 9.@Import-使用ImportBeanDefinitionRegistrar 10.使用Fa

$^,[email&#160;protected],$?,$&lt;,$(@D),$(@F) of makefile

makefile下$(wildcard $^),$^,[email protected],$?,$<,$(@D),$(@F)代表的不同含义 $(filter-out $(PHONY) $(wildcard $^),$^)常用用法为$(wildcard *.c)表示列举当前目录下的所有.c文件这里$^因为会包含依赖的文件名,如果包含的该文件存在,那么将返回其含路径的文件名所以$(wildcard $^)就是用来过滤$^包含的所有文件并且该文件确实在本地存在. 自动化变量$?代表依赖文件列表中被改变

springboot自动装配(1)[email&#160;protected]注解怎么自动装配各种组件

1.对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter) [email protected]注解其实就是组合注解,通过它找到自动装配的注解@EnableAutoConfiguration,再由@EnableAutoConfiguration导入自动装配选择类AutoConfigurationImportSelector的selectImports方法去MATA-INF/spring.factories下面找到需要自动装配的组件的对应配置(各种Au

25、自动装配[email&#160;protected]根据环境注册bean

25.自动装配[email protected]根据环境注册bean 指定组件在哪个环境的情况下才能被注册到容器中 加了环境标识的,只有这个环境被激活才能注册到组件中 默认是default环境 写在类上,整个配置类的激活的时候才能生效 没有标注环境标识的bean,在任何环境下都是加载的 package org.springframework.context.annotation; import java.lang.annotation.Documented; import java.lang.a

Spring Framework 组件注册 之 @Import

Spring Framework 组件注册 之 @Import 写在前面 向spring中注册组件或者叫javaBean是使用spring的功能的前提条件.而且spring也提供了很多种方式,让我们可以将普通的javaBean注册到spring容器中,比如前一篇文章Spring Framework 组件注册 之 @Component中写的利用@Component注解将普通的javaBean注册到容器中,本文说的@Import注解也是spring Framework提供的将普通javaBean注册

Java程序员最常见的SpringBoot有那些组件注册方式?

Java程序员最常见的SpringBoot有那些组件注册方式? 很多程序员在开发的过程中都可能会遇到SpringBoot组件注册这个问题,那么SpringBoot到底有那些组件注册方式呢?今天主要就来和大家分享这个SpringBoot组件注册的几种方式,希望可以帮大家快速解决当下的这个难题. 传统的[email protected][案例demo2]?项目包结构├─java│ └─com│ └─example│ └─demo2│ │ Demo2Application.java│ │ │ └─en