首页 > 其他分享 >Spring中@Bean注解的作用以及如何使用

Spring中@Bean注解的作用以及如何使用

时间:2023-05-07 19:23:01浏览次数:52  
标签:Spring Bean User 模块 注解 public

Spring中@Bean注解的作用以及如何使用

一、Bean是啥

1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化); 

2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性; 

3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解; 

4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了 

5、我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean

二、注解分为两类:

1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean; 

2、一类是注册Bean,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

两种方式的区别:

  • @Component注解作用于类上,而@Bean注解作用于配置类中的某一个方法上;
  • @Component表明告知Spring为当前的这个类创建一个bean,而@Bean表明告知Spring此方法将会返回一个对象,将返回的对象注入到容器中。
  • @Bean注解的使用更加灵活。

如何使用?

在没有了解@Bean注解之前,相信大家都是以这种方式创建对象的:

    @AllArgsConstructor
    @NoArgsConstructor
    @Component
    public class User {
        private String name;
        private Integer age;
    }

然后直接通过@Autowired从容器中取出该对象

    @Autowired
    private User user

同样的场景,来使用@Bean试试。 

    @Configuration
    public class MyConfiguration {
        @Bean
        public User user() {
            return new User();
        }
    }

该注解必须要在标有@Configuration的配置类中使用才会有效。
上述代码表示,将@Bean注解修饰的方法的返回值注入到IOC容器中。

    @Autowired
    private User user

通过上述几段代码,你可能很难发现@Bean注解灵活在哪里,反而还要作用在配置类中,更麻烦!

使用场景

场景1: 有时候我们需要根据条件来注入组件。

    @Configuration
    public class MyConfiguration {
        @Bean
        public User user() {
            int i = 10;
            if(i < 7) {
                return new User("jack", 20);
              } else {
                  return new User("david", 18);
              }
        }
    }

场景2: 想象一下如果我们需要使用外部引入的lib中的组件时怎么办?使用@Component注解标注到别人的源码上面?显然这是不现实的,这个时候@Bean就可以发挥其优势了。

    @Configuration
    public class MyConfiguration {
        @Bean
        public ArrayList<User> list() {
            ArrayList<User> list = new ArrayList<>();
            list.add(new User("nacy", 17));
            return list;
        }
    }

使用@Bean注解在实际项目中解决的问题

在微服务的两个模块,其中模块A作为公共模块,模块B(SpringBoot模块)导入了模块A的Maven依赖(dependency),在项目运行时只启动模块B,模块A相当于一个静态的公共模块,不会去使用SpringBoot启动它。

模块A:

  • 配置类:
@Configuration
@EnableWebSecurity  // 开启Security
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private EmployeeRolePath employeeRolePath;
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
         List<String> uri = employeeRolePath.getUri();
    }
  • EmployeeRolePath:
    @Component
    @ConfigurationProperties("role.employee.path")
    public class EmployeeRolePath {
    
        private List<String> uri;
    
        public List<String> getUri() {
            return uri;
        }
    
        public void setUri(List<String> uri) {
            this.uri = uri;
        }
    }

模块B:

  • 配置类,继承了模块A的配置类
    @Configuration
    @EnableWebSecurity  // 开启Security
    public class SecurityConfig extends WebSecurityConfig {
            // ........
            // .........
    }
  • yml配置文件:
role:
  admin:  # 需要admin权限的访问路径
      path:
        uri:
          - /admin/adminRole/**
  employee: # 需要employee权限的访问路径
      path:
        uri:
          - /admin/category/**
          - /admin/dish/**
          - /admin/flavor/**
          - /admin/setmeal/**

先说一下我要实现的功能:要使上述yaml配置文件中的配置成功绑定到EmployeeRolePath类中并生效。

很显然,上述代码肯定不会生效,原因就是我们启动模块B时,Spring只能够扫描到本模块中的配置类SecurityConfig,以及它继承模块A中的配置类WebSecurityConfig,而作用在EmployeeRolePath类上的注解是不可能为生效的,原因就是模块A根本没启动,没有人去扫描他,它只是一个静态的模块而已。

解决:

在模块A的配置类中使用@Bean注解注入EmployeeRolePath组件

    @Configuration
    @EnableWebSecurity  // 开启Security
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
             List<String> uri = employeeRolePath().getUri();
        }
        
        @Bean
        public EmployeeRolePath employeeRolePath() {
            return new EmployeeRolePath();
    }

如上述在本配置类中要使用该组件,直接调用employeeRolePath()就能获取到容器中的EmployeeRolePath组件了。

为什么这样可以生效?
上述说了,当模块B启动时,会先初始化加载模块B的配置类,而模块B的配置类又继承了模块A的配置类,所以Spring是能够扫描到模块A中的配置的,并且它们是在同一个IOC容器中的,所以在模块B中定义的配置文件也会生效。

 

标签:Spring,Bean,User,模块,注解,public
From: https://www.cnblogs.com/yayuya/p/17379856.html

相关文章

  • HelloSpring
    别提了,学了一会儿黑马的SSM框架,很懵听了女朋友的建议,改换遇见狂神说的Spring的讲解课程了跟着狂神说,编写了最初的程序HelloSpring程序第一步,Maven导入Spring和junit的依赖第二步,创建pojo文件夹,导入一个实体类作为练习记得需要鼠标右键,选择ptgJavaBean(可以自动创建下面那一......
  • Java Bean介绍与配置
    (一)JavaBean介绍1.javaBean的介绍在Java中,有很多class的定义都符合这样的规范:若干private实例字段;通过public方法来读写实例字段。例如:publicclassPerson{privateStringname;privateintage;publicStringgetName(){returnthis.name;}p......
  • Spring复习笔记
    Spring架构核心概念IOC&DIIOCDIbeanbean的实例化......
  • Java 进阶 - Apache BeanUtils
    介绍BeanUtils是ApacheCommons的组件,它们源自JavaAPI并提供Java语言的组件体系结构。JavaBeanUtils设计模式使用实用程序类,这些实用程序类有助于获取和设置Java类的属性值,以便检索和定义Bean属性。常用方法//根据指定的Map填充指定JavaBeans属性publicst......
  • springmvc知识梳理 一篇就能让你的项目按照springmvc框架跑起来
    springmvc目录1.创建基本框架步骤2.@RequestMapping()2.1value属性2.1.1路径支持ant风格2.1.2restful风格2.2method属性2.2.1form表单问题:2.2.2get和post相关问题(涉及面试题):2.3param属性书写格式:thymeleaf语法:2.4headers属性3.获取请求参数......
  • Spring
    SpringFramework1.Spring介绍官网:https://spring.ioSpring能做什么:用以开发web、微服务以及分布式系统等,光这三块就已经占了JavaEE开发的九成多。Spring并不是单一的一个技术,而是一个大家族,可以从官网的Projects中查看其包含的所有技术。SpringFramework:Spring框......
  • SpringMvc
    SpringMVC1SpringMVC概述问题导入SpringMVC框架有什么优点?1.1SpringMVC概述SpringMVC是一种基于Java实现MVC模型的轻量级Web框架优点使用简单,开发便捷(相比于Servlet)灵活性强2入门案例【重点】问题导入在Controller中如何定义访问路径,如何响应数据?2.1实现步骤......
  • SpringBatch之实际操作
    目录1SpringBatch操作1.1SpringBatch介绍1.2依赖配置相关1.2.1pom.xml1.2.2mysql依赖库表1.2.3启动配置1.2.4数据库配置1.3示例Demo1.3.1简单执行1.3.2报错1.4流程控制1.4.1多步骤任务1.4.2Flow用法1.4.3并发执行1.4.4任务决策1.4.5任务嵌套1.5数据操作1.5.1......
  • 使用IDEA2023创建springMVC项目,web项目
    1.使用idea2022创建web项目 2.新建模块 3.编写文件名,记住如果想单独一个项目,不想被包括在其他项目里面就取消位置后面的地址,它有可能是上一个项目的主文件 4.创建完主要项目以后要添加web模块,先选中需要添加web项目的模块,再店家上方+号,选择 web模块 3.修改部......
  • springsecurity 认证,授权,注销,动态菜单,记住我和首页定制
    搭建环境:1.在创建springboot时选择组件web,thymeleaf,spring-security2.导入静态资源,导入后测试一下环境 认证和授权:继承类WebSecurityConfigurerAdapter,重写方法configure若遇到报错:java.lang.IllegalArgumentException:ThereisnoPasswordEncodermappedfortheid"nu......