springboot原理实战(1)--注解方式装配bean

简介: springboot原理实战(1)--注解方式装配bean


现在先了解下,具体的几种注入bean到spring的方式。

也就是来玩一下这个 AnnotationConfigApplicationContext这个类:


1.@Configurable


@Configurable
public class MyConfig {}

测试:


public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        System.out.println(context.getBean(MyConfig.class));
    }


context.getBean有多种方式拿到bean,根据类class,类型等,

结果显示:容器拿到了这个bean:

1dc618a0ed9580ce8bfa6facb208c08f.png


2.@Bean


a.@bean注入


写个bean


public class MyBean {
}


在配置类中@Bean注入,scope配置指定单个或者多个实例方式注入


@Bean(name = "mybean")
@Scope("prototype")
 public MyBean createMyBean(){
     return new MyBean();
 }


b.通过工厂方式注入


①官方提供,实现FactoryBean方式


public class RunableFactoryBean implements FactoryBean<Jeep> {
    @Override
    public Jeep getObject() throws Exception {
        return new Jeep();
    }
    @Override
    public Class<?> getObjectType() {
        return Jeep.class;
    }
    @Override
    public boolean isSingleton() {
        return true;
    }
}


@Configurable
public class MyConfig {
    @Bean
    public RunableFactoryBean createRunnableFactoryBean(){
        return new RunableFactoryBean();
    }
}


测试,测试1:拿到工厂(用&符号前缀),测试2:拿到工厂创建的bean


public class Test1 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        System.out.println(context.getBean("&createRunnableFactoryBean"));
        System.out.println(context.getBean(Jeep.class));
    }
}


结果打印,都拿到了:

5d4c6812c8535adbb050f4ddf2e1bce8.png


②自定义工厂方式


public class Car {
}


public class JeepFactory {
    public Car create(){
        return new Car();
    }
}


先注入工厂,在通过工厂拿到bean


@Configurable
public class MyConfig {
    @Bean
    public JeepFactory creatJeepFactory(){
        return new JeepFactory();
    }
    @Bean
    public Car createJeep(JeepFactory factory){
        return factory.create();
    }
}


测试:略


3.初始化bean前后做一些事情:


在初始化后和销毁的时候调用一些方法:


1)方式1:实现InitializingBean(初始化后触发), DisposableBean(销毁的时候触发)


public class Cat implements InitializingBean, DisposableBean {
    public Cat() {
        System.out.println("=======init cat=========");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("=======afterPropertiesSet=========");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("=======destroy=========");
    }
}


2)方式2:根据@Bean注解属性配置:


public class Dog {
    public void init(){
        System.out.println("init");
    }
    public void destory(){
        System.out.println("destory");
    }
}


@Bean(initMethod="init",destroyMethod="destory")
    public Dog createDog(){
        return new Dog();
    }


3)方式3:@PostContruct


public class Animal {
    @PostConstruct
    public void inital(){
        System.out.println("------initial--------");
    }
    @PreDestroy
    public void close(){
        System.out.println("------close--------");
    }
}


4.组件注入方式


①普通组件@Component


@Component("myUser")
public class User {}


②Resposity ,常用于数据库处理bean


@Repository
public class UserDao {
}


③@Service,常用于业务处理类


@Service
public class UserService {
}


④@controller,常用于请求控制类


@Controller
public class UserController {
}


测试:


public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class, User.class, UserDao.class,
                UserService.class, UserController.class);
        System.out.println(context.getBean(UserDao.class));
        System.out.println(context.getBean(UserService.class));
        System.out.println(context.getBean(UserController.class));
        context.close();
    }
}


运行结果:

5d4c6812c8535adbb050f4ddf2e1bce8.png


5.依赖注入装配bean的方式


① @Autowire


如果多个bean,可以用@Quitifier(“XX”)具体指定,也可使用@Primary提高bean的优先级。


@Controller
public class UserController {
    @Autowired
    private UserDao userDao;
}


@Bean(name = "mybean")
    @Primary
    public MyBean createMyBean(){
        return new MyBean();
    }


②@Resource JSR 250的方式


@Controller
public class UserController {
    @Autowired
    private UserDao userDao;
    @Resource
    private UserService userService;
}


③@Inject JSR-330的方式


需要导包,因为spring项目默认不支持。


<dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>


import org.springframework.stereotype.Component;
import javax.inject.Inject;
@Component("myUser")
public class User {
    //JSR-330
    @Inject
    private Cat cat;
    @Override
    public String toString() {
        return "User{" +
                "cat=" + cat +
                '}';
    }
}


6.组件注入需要扫描包支持,如何扫描包?


方式1,在AnnotationConfigApplicationContext上直接写报名:


46a9d80a6e05e4e3b19d57a0ee70bcdf.png

public class AnnocationClient {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.springboot.demo1",
                "com.springboot.demo2");
        System.out.println(context.getBean(User.class));
        System.out.println(context.getBean(UserDao.class));
        System.out.println(context.getBean(UserController.class));
        context.close();
    }
}


方式2:扫描配置类::


可以写个扫描配置类:

66ba272a0bfc97be54a5fa679e3d5482.png

@ComponentScan(basePackages = "com.springboot.demo1", excludeFilters= @Filter(type = FilterType.ASSIGNABLE_TYPE,classes={DogConfig.class}))
@Configurable
public class AnnocationScan {
}


注意,这里可以选择排除excludeFilters,后面说明咋排除。


public class AnnocationClient2 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnocationScan.class);
//        System.out.println(context.getBean(RunableFactoryBean.class));
        System.out.println(context.getBean(User.class));
        System.out.println(context.getBean(UserDao.class));
//        System.out.println(context.getBean(Cat.class));
        System.out.println(context.getBean(UserController.class));
    }
}


配置排除的包:

88b9988b40447cb37c7e3c492d49867f.png

点击排除的枚举类:


public enum FilterType {
    ANNOTATION, //通过注解排除
    ASSIGNABLE_TYPE, //通过指定的类排除
    ASPECTJ, //通过aspectj表达式排除
    REGEX, //通过正则表达式排除
    CUSTOM; //自定义接口,实现org.springframework.core.type.filter.TypeFilter}排除
    private FilterType() {
    }
}


上面的截图是使用的ASSIGNABLE_TYPE自定类方式。


相关文章
|
4天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
30 3
|
4天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
15 1
|
4天前
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
2天前
|
Java
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
|
2天前
|
Java 开发者 Spring
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【5月更文挑战第16天】在Spring Boot中,@RequiredArgsConstructor 和 @Lazy 是两个有用的注解,它们分别用于简化构造函数的生成和控制Bean的加载时间。下面详细解析这两个注解的概念、优缺点以及在实际应用中的示例。
5 1
|
3天前
|
Java 开发者 Spring
springboot DDD的概念以及实战
【5月更文挑战第15天】领域驱动设计(Domain-Driven Design,简称DDD)是一种软件设计方法论,它强调基于业务领域的复杂性来构建软件
10 2
|
4天前
|
存储 缓存 Java
【JavaEE】Spring中注解的方式去获取Bean对象
【JavaEE】Spring中注解的方式去获取Bean对象
3 0
|
4天前
|
存储 Java 对象存储
【JavaEE】Spring中注解的方式去存储Bean对象
【JavaEE】Spring中注解的方式去存储Bean对象
7 0
|
4天前
|
开发框架 监控 Java
深入探索Spring Boot的监控、管理和测试功能及实战应用
【5月更文挑战第14天】Spring Boot是一个快速开发框架,提供了一系列的功能模块,包括监控、管理和测试等。本文将深入探讨Spring Boot中监控、管理和测试功能的原理与应用,并提供实际应用场景的示例。
16 2
|
4天前
|
XML Java 开发者
springboot 启动原理、启动过程、启动机制的介绍
【5月更文挑战第13天】Spring Boot 是一种基于 Java 的框架,用于创建独立的、生产级别的 Spring 应用程序。它的主要目标是简化 Spring 应用的初始搭建和开发过程,同时提供一系列大型项目常见的非功能性特征(如嵌入式服务器、安全性、度量、健康检查和外部化配置)。
18 3