- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
Spring @Bean
注释表明一个方法生成了一个由 Spring 容器管理的 bean。可以在 @Configuration
和 @Component
类中创建 Spring @Bean
方法。 bean 的默认范围是单例。 @Bean
注解可以与 @Scope
、@Lazy
、@DependsOn
、@Primary
等注解结合使用。
找到 @Bean
注解的可选方法。
autowireCandidate:布尔值,用于确定此 bean 是否是自动装配到其他 bean 的候选对象。默认为真。它在 Spring 5.1 中引入。
initMethod:在初始化期间调用 bean 实例的方法名称。默认是没有要调用的 init 方法。
destroyMethod:关闭应用程序上下文时调用 bean 实例的方法名称。该方法必须没有参数,但可以抛出异常。
名称:此 bean 的名称。默认 bean 名称是方法名称。
值:名称的别名。
在此页面上,我们将通过示例详细讨论 @Bean
方法。
我们可以在 @Configuration
类中创建 bean,并在方法中注释 @Bean
。在 @Configuration
类中,创建带有 @Bean
注释的方法,并且方法需要返回一个 bean 的对象。在我们的示例中,我们将两个类 BeanA
和 BeanB
创建为 Spring bean。找到使用 @Bean
注解创建这些类的 bean 的代码。
AppConfig.java
package com.concretepage;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public BeanA getBeanA() {
BeanA beanA = new BeanA();
beanA.setName("Bean A");
return beanA;
}
@Bean
public BeanB getBeanB() {
return new BeanB("Bean B");
}
}
默认的 bean 名称将是方法名称。这意味着第一个 bean 名称是 getBeanA
,第二个 bean 名称是 getBeanB
。
BeanA.java
package com.concretepage;
public class BeanA {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
BeanB.java
package com.concretepage;
public class BeanB {
private String name;
public BeanB(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
可以通过 bean 类或 bean 名称访问 bean,也可以使用 @Autowired
注释将其注入组件中。
MySpringApp.java
package com.concretepage;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MySpringApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
//BeanA beanA = ctx.getBean(BeanA.class);
BeanA beanA = (BeanA) ctx.getBean("getBeanA");
System.out.println(beanA.getName());
BeanB beanB = ctx.getBean(BeanB.class);
//BeanB beanB = (BeanB) ctx.getBean("getBeanB");
System.out.println(beanB.getName());
ctx.registerShutdownHook();
ctx.close();
}
}
输出
Bean A
Bean B
我们可以使用 @Bean
注释的 name
属性更改默认 bean 名称。默认的 bean 名称是 @Bean
注释的方法名称。当我们使用 name
属性分配 bean 名称时,默认 bean 名称将不可用。可以将多个 bean 名称分配为单个 bean 的数组。要指定 bean 名称,我们可以使用 name
或 value
属性。找到例子。
AppConfig.java
@Configuration
public class AppConfig {
@Bean("a1Bean")
public BeanA getBeanA() {
BeanA beanA = new BeanA();
beanA.setName("Bean A");
return beanA;
}
@Bean(name={"b1Bean", "b2Bean"})
public BeanB getBeanB() {
return new BeanB("Bean B");
}
}
第一个 bean 名称是 a1Bean
,第二个 bean 名称是 b1Bean
和 b2Bean
。我们可以通过它们的名称访问 bean,如下所示。
MySpringApp.java
public class MySpringApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
BeanA beanA = (BeanA) ctx.getBean("a1Bean");
System.out.println(beanA.getName());
BeanB beanB1 = (BeanB) ctx.getBean("b1Bean");
System.out.println(beanB1.getName());
BeanB beanB2 = (BeanB) ctx.getBean("b2Bean");
System.out.println(beanB2.getName());
ctx.registerShutdownHook();
ctx.close();
}
}
b1Bean
和 b2Bean
将返回相同的 bean。
输出
Bean A
Bean B
Bean B
initMethod
和 destroyMethod
是 @Bean
注释的属性。在 bean 中,我们可以有初始化和销毁方法。 initMethod
指定任何初始化方法,destroyMethod
方法指定任何销毁方法。初始化方法将在创建 bean 之后调用,而销毁方法将在关闭应用程序上下文之前调用。
Work.java
package com.concretepage;
public class Work {
public void initWork() {
System.out.println("--- Initializing Work ---");
}
public void doWork() {
System.out.println("-- Doing my Work ---");
}
public void closeWork() {
System.out.println("-- Closing Work ---");
}
}
AppConfig.java
package com.concretepage;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean(name="mywork", initMethod="initWork", destroyMethod="closeWork")
public Work getWork() {
return new Work();
}
}
MySpringApp.java
package com.concretepage;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MySpringApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Work work = (Work) ctx.getBean("mywork");
work.doWork();
ctx.registerShutdownHook();
ctx.close();
}
}
输出
--- Initializing Work ---
-- Doing my Work ---
-- Closing Work ---
在同一个配置类中,我们可以通过直接调用其他 @Bean
方法来引用一个 @Bean
方法。保证内部 bean 引用尊重范围和 AOP 语义。找到例子。
AppConfig.java
package com.concretepage;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public Person getPerson() {
return new Person("Mahesh");
}
@Bean
public School getSchool() {
return new School(getPerson());
}
}
Person.java
package com.concretepage;
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
School.java
package com.concretepage;
public class School {
private String schoolName = "ABC School";
private String principal;
public School(Person person) {
this.principal = person.getName();
}
public String getSchoolName() {
return schoolName;
}
public String getPrincipal() {
return principal;
}
}
MySpringApp.java
package com.concretepage;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MySpringApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
School school = ctx.getBean(School.class);
System.out.println(school.getPrincipal());
System.out.println(school.getSchoolName());
ctx.registerShutdownHook();
ctx.close();
}
}
输出
Mahesh
ABC School
@Bean
可与 @Scope
、@Lazy
、@DependsOn
、@Primary
等一起使用。
1。使用 @Scope
bean 的默认范围是 singleton
。我们可以使用 @Scope
注解更改 bean 范围。 Bean 范围是 prototype
、request
、session
等。找到一个示例示例将 bean 范围更改为 prototype
。
AppConfig.java
@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
public BeanA getBeanA() {
return new BeanA();
}
}
2。使用 @Lazy
@Lazy
指示 bean 是否要延迟初始化。
AppConfig.java
@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
@Lazy(true)
public BeanA getBeanA() {
return new BeanA();
}
}
3。使用 @DependsOn
@DependsOn
指定当前 bean 所依赖的 bean。
AppConfig.java
@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
@DependsOn("myBeanB")
public BeanA getBeanA() {
return new BeanA();
}
@Bean("myBeanB")
public BeanB getBeanB() {
return new BeanB();
}
}
4。使用 @Primary
@Primary
表示当多个候选者有资格自动装配单值依赖项时,应优先考虑 bean。
AppConfig.java
@Configuration
public class AppConfig {
@Bean
@Primary
public BeanA getBeanA() {
return new BeanA();
}
------
}
@Bean
方法也可以在使用 @Component
注释的类中声明。在这种情况下,@Bean
方法在 lite 模式下处理。这里的 @Bean
方法将被容器视为普通的工厂方法,并正确地遵循范围和生命周期回调。@Configuration
和 @Component
类的 @Bean
方法的区别在于 @Component
类的 bean 不支持内部 bean 引用。在 lite 模式下,如果 @Bean
方法正在调用另一个 bean 方法,它将是标准 Java 方法调用。找到在 @Component
类中创建 @Bean
方法的示例。
app.java
package com.concretepage;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class Utility {
public int addNumbers(int num1, int num2) {
return num1 + num2;
}
@Bean
public Square getSquare() {
return new Square();
}
}
Square.java
package com.concretepage;
public class Square {
public int getSquare(int arm) {
return arm * arm;
}
}
AppConfig.java
package com.concretepage;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.concretepage")
public class AppConfig {
}
MySpringApp.java
package com.concretepage;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MySpringApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Square square = ctx.getBean(Square.class);
int num = 10;
System.out.println("Square of " + num + " = "+square.getSquare(10));
ctx.registerShutdownHook();
ctx.close();
}
}
输出
Square of 10 = 100
注解@CrossOrigin 出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。例如,当你在一个标签中检查你的银行账户时,你可以在另一个选项卡上拥有EVILL网站。来自EVILL的脚本
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章深入理解Java高级特性——注解由作者收集整理,如果你对这篇文章有兴趣,
概述 在这个快速教程中,我们将探索 Spring 的 @RequestParam 注解。 简单地说,我们可以使用 @RequestParam 从请求中提取查询参数、表单参数甚至文件。我们将讨论如何使用
我有一个关于 Spring @Async 注释的问题。我有一个 Controller 自动连接了一个服务(GnInsuranceDetailsService) @RequestMapping(va
我在使用注释来调用注释所属的方法时遇到了一些麻烦......我将举一个例子: class MyEventHandlers { @handler(id=“1”) public doSom
我是.Net程序员,但是这次我正在从事Java项目,并且遇到了一些困难。这个 java 项目不是我的,它是由其他开发人员开发的,并且使用 Hibernate。 当我运行 Ant 构建器时,我收到此错误
我在 Grails 文档(第 9 章:测试)中读到过这个注解。但是我不明白这是什么... 问题是我需要模拟 GORM 的动态方法,有一种方法可以自动模拟它们,而不必编写我需要的所有方法吗? 最佳答案
这个问题在这里已经有了答案: How to get annotation class name, attribute values using reflection (2 个答案) 关闭 5 年前。
如何了解 Java EE 6 JMS 注释规范支持的所有有效属性集@ActivationConfigProperty Java EE 6 Documentation for @ActivationCo
我认为这是不可能的,但也许我错了。所以我问你,如果可能的话。 ;-) 如果我定义了一个注释,它只接受类引用,它扩展了一些可能的接口(interface)或类: Class serviceIFProv
我正在尝试使用 javax.validation 验证一些 DTO,但似乎注释 @NotEmpty 没有检查参数是否为 null。 这是我的类(class): Person.class public
我是 hibernate 新手,我正在尝试学习它,但在尝试使一对多关系正常工作时遇到了问题。我尝试了几个例子,但似乎没有一个起作用。 有人可以看一下下面的代码并告诉我哪里出了问题吗?我尝试了很多不同的
这个问题已经有答案了: Why doesn't Java offer operator overloading? (17 个回答) 已关闭 9 年前。 每个人都知道 Java 中的简单算术如何用于基元
有人知道如何用 Python 处理这种 XML 注释,这是我第一次看到。 <?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd
我遇到了这个link这解释了如何继承 bean。假设此示例中的 HelloWorld 类使用 @Component 注释作为 bean 公开,如何创建另一个继承此 bean 的 bean?我可以使用
谁能告诉我这段代码是否: public class OvTester { @Override public int hashCode() { return toStri
我有一个实体,它有一个非键列,我已将其设置为在我的数据库中自动生成。 我不能使用 @GeneratedValue,因为据我所知,它仅适用于关键字段。 在这种情况下,如何指示非键列是自动生成的? 最佳答
所以可能像很多人一样,我通常会临时注释掉代码,主要是为了调试目的。我目前放了类似 **DEBUG** 或任何容易搜索的内容,但我认为让编译器在发现临时注释掉的代码时输出警告(甚至错误)可能很有用。我想
此组件解决的问题是: 「谁」在「什么时间」对「什么」做了「什么事」 本组件目前针对 Spring-boot 做了 Autoconfig,如果是 SpringMVC,也可自己在 xml 初始化 b
配置全局乱码过滤器 参数绑定注解@RequestParam 注解@RequestParam的参数使用说明 获得Restful风格的参数 自定义类型转换器 自定义转换器的开发步骤: 获得Servlet相
我是一名优秀的程序员,十分优秀!