Spring | 基于注解配置Bean(一)
创始人
2025-06-01 09:09:34

Spring 能够从 classpath 下自动扫描,侦测具有特定注解的组件,组件包括

  • @Component:基本注解,标识了一个受 Spring 管理的组件
  • @Respository:标识持久层组件
  • @Service:标识服务层组件
  • @Controller:标识表现层组件

命名政策: 第一个字母小写,也可以在注解中通过 value 属性标识组件名称

//接口层
public interface UserRepository {public void save();
}//实现层
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository {@Overridepublic void save() {System.out.println("UserRepositoryImpl Save ...");}}//业务层
@Service
public class UserService {public void add() {System.out.println("UserService add ... ");}}//控制层
@Controller
public class UserController {public void execute() {System.out.println("UserController execute ... ");}}

Spring 默认情况下,注解的名字为类名的第一个字母小写,如 testObject

@Component
public class TestObject {}

注解的值也可以自己设定,后面使用 getBean() 调用的时候也可以使用自己设置的值。如以下默认注解名为 userRepositoryImpl,可以使用 value 属性标识注解名,@Repository("userRepository")

@Repository()
public class UserRepositoryImpl implements UserRepository {@Overridepublic void save() {System.out.println("UserRepositoryImpl Save ...");}}

getBean() 方法中的参数,默认为注解后的第一个字母小写的类名,也可以使用自己用 value 标识的注解名

public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml");TestObject o = (TestObject) ctx.getBean("testObject");System.out.println(o);UserController userController = (UserController) ctx.getBean("userController");userController.execute();UserRepository userRepository = (UserRepository) ctx.getBean("userRepository");System.out.println(userRepository);UserService userService = (UserService) ctx.getBean("userService");System.out.println(userService);
}
  • Bean 的基本配置如下,在 Spring 的配置文件中声明 ,然后在 base-package 下声明需要扫描的基类包

edu.just.spring.beans.annotation 包及子包下扫描,此时该包下所有注解过的类都能执行

  • 使用 resource-pattern 属性来过滤

此配置标识只能执行 edu.just.spring.beans.annotation.repository 子包下的 Bean 的方法

  • 使用 context:exclude-filter 属性来过滤,表示排除指定的类
    annotation:表示目标类是否标注了某个注解进行扫描
    assignable:表示目标类是否继承或扩展某个特定类
    expression: 注解的名称


使用注解名进行排除,排除指定子包下注解为 Repository 的目标类



使用接口名进行排除,排除指定子包下接口名为 UserRepository 的目标类

  • 使用 context:include-filter 属性来过滤,表示要包含的类,同时需要设定 use-default-filters 才可以使用
    use-default-filters:默认为 true,用来指示是否自动扫描带有 @Component@Repository@Service@Controller 的类。
    (**PS:**只有设置为 false 时,才会扫描指定包含的类)


使用注解名进行包含,此时只能执行标识为 Repository 的类



使用接口名字进行包含,此时只能包含接口名为 UserRepository 的目标类

相关内容

热门资讯

麦香面花开|传统花馍的仪式感,... 你发现没?春节吃啥都行,但少了花馍总觉得少了点年味。咱们老祖宗用面粉捏出的吉祥寓意,现在还能让人心情...
陕州花馍:在指尖上流传千年的面... 陕州花馍:在指尖上流传千年的面塑艺术 新闻记者 王红权通讯员 董芳远 王青伟 “二十八,把面发;二十...
年夜饭|3个传统家常菜,让团圆... 年夜饭,是中国人最温情的仪式 你发现没,一到年底,朋友圈全是回家的倒计时 78%的人说,最期待的...
原创 菠... 你是不是也遇到过这种情况?辛辛苦苦炒一盘,结果菠菜又黑又涩,鸡蛋又老又柴,整个盘子还汪着一滩水…… ...
省中医“健康年货” | 春节零... 年货满筐,不如健康在旁。 新春佳节,广东省中医院重磅推出【省中医健康年货】专栏——这里有大专家们精心...