Spring容器 使用 和 执行流程 ,注解 你真的会吗?(让你一下通透~)

目录

前言

一、ApplicationContext 和 BeanFactory 的区别

二、主要工作流程

三、开发步骤

3.1、创建Maven项目

3.2、创建Spring的核心配置文件

3.3、Spring注解

3.3.1、类注解

3.3.2、五大类注解的关系

3.3.3、方法注解

3.3.4、属性注入

3.3.5、五大注解关系图(一看就懂)

3.4、创建程序入口类

3.5、跟Spring打声招呼吧~(使用Bean对象)

小结


前言

        Spring提供了两大顶级接口可以获取Spring对象,他们分别是 ApplicationContext 和 BeanFactory,而我们日常开发主要使用的是 ApplicationContext,BeanFactory已经过时,因此本文主要围绕ApplicationContext来介绍~


一、ApplicationContext 和 BeanFactory 的区别

相同点:

1.都可以得到Spring对象(Spring上下文)。

2.都是来自Spring的顶级接口。

不同点:

1.继承关系:ApplicationContext 属于 BcanFactory 的子类。

2.功能:BcanFactory只有最基础访问Bean的能力,而ApplicationContext 除了拥有 BeanFactory功能之外,还包含了更多功能,如:国际化支持、资源访问、时间传播等。

3.性能:ApplicationContext 加载方式是将 Bean 对象一次性加载,所以在访问 Bean 对象时会很快(饿汉模式,但也不完全是,现在的高版本会根据你电脑的情况智能的去加载,如果刚开始加载时系统资源比较紧张,就会放到后面加载);BeanFactory 只有需要在需要某个 Bean 时,才会加载 Bean 对象, 所以它在执行 Bean 获取时,比较慢(懒汉模式)。


二、主要工作流程


三、开发步骤

3.1、创建Maven项目

首先需要在pom.xml配置文件中引入相关依赖,引入完后记得刷新Maven~

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring-demo2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    </dependencies>

</project>

3.2、创建Spring的核心配置文件

在src/main/resources下创建一个xml文件用来声明加载Bean对象;

base-package是用来扫描指定包下的Spring注解,找到对应的Bean对象,加载到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:content="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 https://www.springframework.org/schema/context/spring-context.xsd">
    <!--base-package表示要扫描的路径-->
    <content:component-scan base-package="com.demo.component"></content:component-scan>
</beans>

3.3、Spring注解

3.3.1、类注解

        放在类上的,将对象存储到Spring中的五大注解,他们的功能相同,只是用来标识功能的(仅限Spring,在Spring Boot 和Spring MVC 中功能天差地别),方便程序员辨别;

@Controller(控制器):归属于业务逻辑层,用来接收用户的请求,并检查用户参数的有效性,准备数据给 Service 提供,最后返回响应。

@Service(服务):归属于服务层,会先定义好接口(例如 IUserService,开头的 I 表示接口的意思),然后实现接口(例如 UserServiceImpl,后面的 Impl 表示实现接口)处理主要的业务逻辑,并且由于 Service 层需要对 Mapper 层负责,因此也需要进行一些参数校验.  另外可能会设计到事务,并且所有涉及的异常统一在 Service 层抛出,不直接和数据库交互,类似于控制中心。

@Repository / @Mapper(仓库):归属于持久层,是直接和数据库进行交互的,通常一个表都会对应一个@Repository。(对数据库负责)

@Component(组件):归属于公共工具类,提供某些公共方法。(工具类)

@Configuration(配置):归属于配置层,是用来配置当前项目的一些信息;(对项目的全局配置负责)

3.3.2、五大类注解的关系

@Component 是 @Controller、@Service、@Repository、@Configuration 的父类;

3.3.3、方法注解

注意:(一定需要配合5大注解一起使用,否则无效)

@Bean:放在方法上,将当前修饰方法的返回的对象存储到Spring中。(可以自定义一个或多个name属性,一旦设置了name属性,原方法名就不能获取对象了,只能使用设置的name获取)

3.3.4、属性注入

可以将其他类的Bean对象,注入到本类作为属性;

@Autowired :通常用来将 Service 类注⼊到 Controller 类中(可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊);

@Resource 只能⽤于 Setter 注⼊和属性注⼊;

@Autowired 和 @Resource 的区别:

出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;

使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。

注入范围不同:@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注 ⼊和属性注⼊,不能⽤于构造函数注⼊;

3.3.5、五大注解关系图(一看就懂)

3.4、创建程序入口类

        有了这个程序入口类,我们就可以获取Spring对象了,同时,获取Spring时需要给一个参数,这个参数就像是创建Spring容器的一个指导书(声明加载Bean对象的xml文件),这个 指导书就会告诉Spring需要将哪些Bean对象注入到容器(这里其实还有很多方式,但那些方式比较low,这里我们只需要掌握:扫描对应包下注解的方式);

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        //获取Spring对象(Spring上下文)
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
    }
}

3.5、跟Spring打声招呼吧~(使用Bean对象)

        我们可以在扫描的包下创建一个Bean对象,通过上面步骤获取了Spring对象之后,就可以通过getBean方法获取Bean对象啦~

注意:getBean的参数有些讲究

1. 当类名首字母和第二个字母都是大写的时候,那么类名本身就是它的name属性;

2. 其他情况,均按照类名首字母小写的形式,填写name属性;

import com.demo.component.ArticleController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        //获取Spring对象(Spring上下文)
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //获取Bean对象,这里第一个参数是Spring自己生成的身份标识,默认是类名(第一个首字母小写)
        ArticleController articleController =
                context.getBean("articleController", ArticleController.class);
        //使用Bean对象
        System.out.println(articleController.sayHello());
    }
}

你好,Spring!


小结

你学费了吗?


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用Spring容器注解来管理Netty中的Channel和Handler可以使代码更加简洁和易于维护。具体实现步骤如下: 1. 在Netty的ServerBootstrap或者Bootstrap对象中,设置Channel和Handler的工厂Spring容器中的Bean。例如: ```java @Configuration public class NettyConfig { @Autowired private ApplicationContext applicationContext; @Bean public ServerBootstrap serverBootstrap() { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup(), workerGroup()) .channel(NioServerSocketChannel.class) .childHandler(channelInitializer()); return serverBootstrap; } @Bean public ChannelInitializer<SocketChannel> channelInitializer() { return new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(applicationContext.getBean(SocketHandler.class)); } }; } @Bean public EventLoopGroup bossGroup() { return new NioEventLoopGroup(); } @Bean public EventLoopGroup workerGroup() { return new NioEventLoopGroup(); } } ``` 在上面的示例中,我们通过调用`applicationContext.getBean(SocketHandler.class)`来获取Spring容器中的`SocketHandler`对象,并将其添加到`SocketChannel`的Pipeline中。 2. 在Handler使用Spring容器注解,例如: ```java @Component public class SocketHandler extends ChannelInboundHandlerAdapter { @Autowired private MyService myService; @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // 处理消息 myService.doSomething(); } } ``` 在上面的示例中,我们使用`@Autowired`注解将`MyService`对象注入到`SocketHandler`中,这样我们就可以在`channelRead()`方法使用`MyService`对象来处理消息。 需要注意的是,在使用Spring容器注解时,需要保证HandlerSpring容器管理,可以通过在上添加`@Component`或者其他相关注解来实现。同时,需要在Netty的ServerBootstrap或者Bootstrap对象中设置正确的Channel和Handler工厂

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值