【springboot】springboot 注解|@Value注解等

目录

@Autowired

@Component:

@Controller:

@Service:

@Repository:

@Component、@Repository、@Service、@Controller区别

@Override

@Service()

DAO层

@Bean

@Bean

@Configuration

@Value注解的使用总结---研读 

简单介绍

@Value注解使用记录

使用@Value注解


@Autowired

@Autowired注解的意思就是,当Spring发现@Autowired注解时,将自动在代码上下文中找到与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。

@Autowired用法详解@Autowired用法详解 - Boblim - 博客园

Spring 注解配置(2)——@Autowired - Just_Do - 博客园  非常好值得阅读

@Component:


这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。

@Controller:


这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。

@Service:


此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。

@Repository:


这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

下面用案例来具体说明

UserRepository.java

package com.proc.bean.repository;

public interface UserRepository {
    
    void save();
}

这里定义了一个UserRepository接口,其中定义了一个save方法

UserRepositoryImps.java

package com.proc.bean.repository;

import org.springframework.stereotype.Repository;

@Repository("userRepository")
public class UserRepositoryImps implements UserRepository{

    @Override
    public void save() {
        System.out.println("UserRepositoryImps save");
    }
}

定义一个UserRepository接口的实现类,并实现save方法,在这里指定了该bean在IoC中标识符名称为userRepository

UserService.java

package com.proc.bean.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.proc.bean.repository.UserRepository;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;
    
    public void save(){
        userRepository.save();
    }
}

这里需要一个UserRepository类型的属性,通过@Autowired自动装配方式,从IoC容器中去查找到,并返回给该属性

applicationContext.xml配置

<context:component-scan base-package="com.proc.bean" />

测试代码:

1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2 
3 UserService userService=(UserService) ctx.getBean("userService");
4 userService.save();

输出结果:UserRepositoryImps save

@Component、@Repository、@Service、@Controller区别

spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。

    在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。

在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。 Spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件时一样的。要使用自动扫描机制,我们需要打开以下配置信息:  

Spring注解@Component、@Repository、@Service、@Controller区别 - 临界 - 博客园

@Override
 

@Override是伪代码,表示重写。(当然不写@Override也可以),不过写上有如下好处: 
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。
 
举例:在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性。
@Override
public void onCreate(Bundle savedInstanceState)

{…….}
这种写法是正确的,如果你写成:

@Override
public void oncreate(Bundle savedInstanceState)
{…….}
编译器会报如下错误:The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以确保你正确重写onCreate方法(因为oncreate应该为onCreate)。

而如果你不加@Override,则编译器将不会检测出错误,而是会认为你为子类定义了一个新方法:oncreate

在Spring2.0之前的版本中,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常

在Spring2.5版本中,引入了更多的Spring类注解:@Component,@Service,@Controller。@Component是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。

因此,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。

最后,如果你不知道要在项目的业务层采用@Service还是@Component注解。那么,@Service是一个更好的选择。

就如上文所说的,@Repository早已被支持了在你的持久层作为一个标记可以去自动处理数据库操作产生的异常(译者注:因为原生的java操作数据库所产生的异常只定义了几种,但是产生数据库异常的原因却有很多种,这样对于数据库操作的报错排查造成了一定的影响;而Spring拓展了原生的持久层异常,针对不同的产生原因有了更多的异常进行描述。所以,在注解了@Repository的类上如果数据库操作中抛出了异常,就能对其进行处理,转而抛出的是翻译后的spring专属数据库异常,方便我们对异常进行排查处理)。

注解含义
@Component最普通的组件,可以被注入到spring容器进行管理
@Repository作用于持久层
@Service作用于业务逻辑层
@Controller作用于表现层(spring-mvc的注解)


https://msd.misuland.com/pd/3113337336633493026

这几个注解几乎可以说是一样的:因为被这些注解修饰的类就会被Spring扫描到并注入到Spring的bean容器中。

总结
@Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理  @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能  @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。  @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。  @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。  用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。

@Service()

此注注解属于业务逻辑层,service或者manager层
默认按照名称进行装配,如果名称可以通过name属性指定,如果没有name属性,注解写在字段上时,默认去字段名进行查找,如果注解写在setter方法上,默认按照方法属性名称进行装配。当找不到匹配的bean时,才按照类型进行装配,如果name名称一旦指定就会按照名称进行装配

3. @Repository持久层
此注解式持久层组件,用于标注数据访问组件,即DAO组件


DAO层

https://blog.csdn.net/qq_41357573/article/details/84454502

@Bean

https://www.jianshu.com/p/93727fa9bf23

用注解的方式代替xml配置,告诉spring容器加载哪些对象到容器中。

如:

POJO

public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
    this.name = name;
    this.age = age;
    }

    // 省略 getter setter

  // 后续会省略 toString 方法, 使用 IDE 自动生成就可以了
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

spring xml配置方式

<bean id="person" class="me.sjl.bean.Person">
    <property name="age" value="18"/>
    <property name="name" value="sjl"/>
</bean>


以上是我们使用传统的 xml 配置方式创建一个 bean 的方式,下面我们使用注解来创建一个 bean。

 springboot 注解方式

@Bean

JavaConfig 方式

@Configuration
public class BeanConfig {

    @Bean
    public Person person() {
        return new Person("SJL01", 20);
    }

}

在配置类上打个一个 @Configuration 注解,表示声明该类为 Spring 的配置类。在创建一个方法,方法返回对象即我们要创建的对象 Person , 返回该对象的实例。在方法上打上注解 @Bean即表示声明该方法返回的实例是受 Spring 管理的 Bean。


链接:https://www.jianshu.com/p/93727fa9bf23

@Configuration

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

原文链接:https://blog.csdn.net/BinshaoNo_1/article/details/85005935

@Value注解的使用总结---研读 

2020-03-20 14:40:14

原文链接:https://blog.csdn.net/hunan961/article/details/79206291

简单介绍

Spring框架功能很强大,但是就算是一个很简单的项目,我们也要配置很多东西。因此就有了Spring Boot框架,它的作用很简单,就是帮我们自动配置。Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置。如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用我们自己的配置。另外,Spring Boot还集成了嵌入式的Web服务器,系统监控等很多有用的功,让我们快速构建企业及应用程序。

@Value注解使用记录

配置文件application.yml

这里通过@Value注解注入配置文件中的内容进行讲解,比如我们开发项目时常常会有几种环境,比如dev环境,test环境等等,不同的环境某些参数就会不一样,配置文件不一样,这个时候就会用到@value注解了 

首先:如图,写了四个配置文件(这里使用yml文件),注意命名规范:application-xxx.yml 因为项目去默认加载配置文件的时候会有这个格式要求。 
 这里写图片描述

如图,application.yml中的内容为:这里指定了8090的端口,不指定的话就是8080的默认端口,然后指定了运行环境为:stage环境,这时启动项目就会去加载application-stage.yml文件。 

这里写图片描述
 
当然,我们也可以用下图的方式指定运行环境: 

这里写图片描述

接下来看看其他三个配置文件中的内容:

 
application-dev.yml:

spring:
    profiles: dev

user:
    userName: 王立国-dev
    sex: 男
    age: 18
author:
    name: wlg-dev
    height: 17412345678910

application-test.yml:

spring:
    profiles: test

user:
    userName: 王立国-test
    sex: 男
    age: 18
author:
    name: wlg-test
    height: 17412345678910

application-stage.yml:

spring:
    profiles: stage

user:
    userName: 王立国-stage
    sex: 男
    age: 18
author:
    name: wlg-stage
    height: 17412345678910

每个配置文件都说明了自己的spring.profiles名称,然后其他内容稍有不同以示区分。

使用@Value注解

 service实现类代码:

@Service
public class HelloWorldServiceImpl implements IHelloWorldService {

    @Autowired
    private MyConfig myConfig;

    @Value(value = "${user.userName}")
    private String userName;
    @Value("${user.sex}")
    private String sex;
    @Value("${user.age}")
    private String age;

    @Override
    public String getMessage() {
        return "姓名:"+userName+" 性别:"+sex+" 年龄:"+ age +" 作者&身高:"+myConfig.getName()+" "+myConfig.getHeight();
    }
}

可以看得value注解的使用方式:@Value(value = “${user.userName}”),这个时候就会把配置文件里的user.userName的值赋值给变量userName 
可以预测到,当使启动不同环境的项目时,其userName,sex,age是不同的 
这是在application.yml中写了stage环境启动项目后页面的内容 

这里写图片描述

然后还有dev,test如下图:

这里写图片描述

这里写图片描述

其他方法读取配置文件

这里写图片描述

内容为:

package spring_boot.demo.Hw.ManageConfig;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/*
 * Copyright Shanghai Hand Co. Ltd.
 *
 * @author liguo.wang@hand-china.com
 * @date 2018/1/26 10:19
 * @version: 1.0
 * @description
 */
//加上注释@Component,可以直接在其他地方使用@Autowired来创建其实例对象
@Component
@ConfigurationProperties(prefix = "author")
public class MyConfig {
    private String name;
    private String height;

    public String getName() {
        return name;
    }

    public MyConfig setName(String name) {
        this.name = name;
        return this;
    }

    public String getHeight() {
        return height;
    }

    public MyConfig setHeight(String height) {
        this.height = height;
        return this;
    }
}

就是通过这种方法把配置文件中的author的信息注入到service实现类中,然后返回到页面上的

另外还有方法读取配置文件中的内容,这里就不再记录了

banner(在线横幅生成器)的使用

最后这里记录一下banner的使用 
 这里写图片描述
如图在项目启动时,让这块区域风骚起来。首先给个网址: 
http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20 
在中间那块区域输入你想要的文件,还可以选择字体等等,然后把形成的图像粘贴复制到一个txt中,取名banner.txt,然后把它放到resource目录下,之后启动项目就有了,每次要更换团就更换banner.txt中的内容即可。

posted on 2022-10-04 01:27  bdy  阅读(10)  评论(0编辑  收藏  举报

导航