IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring-注解 -> 正文阅读

[Java知识库]Spring-注解

目录

类注解

BeanName生成

方法注解

?方法注解重命名

获取Bean对象

注入方式

属性注入

构造方法注入?

setter方法注入

三种注入的区别

Resource注解

同一个类型被注入多次


Spring的注解可以帮助我们更方便的放入和取出对象

创建maven项目

1、pom.xml引入Spring框架的依赖

2、配置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">
    <content:component-scan base-package=""></content:component-scan>
</beans>

其中:? ? <content:component-scan base-package=""></content:component-scan>的作用就是配置扫描路径,只有在这个路径下的java类,才会被注册入Spring

?

类注解

五大注解

@Controller 控制器存储
@Service 服务存储
@Repository 仓库存储
@Component 组件存储
@Configuration 配置存储
@Controller
public class Spring {
    public void print() {
        System.out.println("spring");
    }
}
public class use {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");

        //这里 我们并没有指定id,默认小驼峰
        Spring spring=context.getBean("spring",Spring.class);
        spring.print();
    }
}

加了@controller注解后,Spring类注册到了框架内

其他四个注解也可以起到注册作用

这五个注解起到了同一个作用,都是将类注册到Spring框架中,那为啥要有5个呢

在一个完整的体系中,一个程序至少分为5层:

1、controller层为控制层,主要处理外部请求,也就是校验前端数据(前端请求数据是否合理)

2、service层为业务层,用来实现业务逻辑(数据组装和接口调用)

3、Repository层为数据持久层(Dao层),用于操作数据库

4、Component层为组件层

5、Configuration层为配置层

使用五种注解,我们可以通过注解明白这个类处于哪一层,执行的是什么功能、增加代码的可读性

这5大类注解的关系:

?查看源码,发现Component接口是其他四个注解接口的父接口,其他四个注解之间是“兄弟”关系

BeanName生成

public class use {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        //这里 我们并没有指定id,默认小驼峰
        Spring spring=context.getBean("spring",Spring.class);
        spring.print();

        API api=context.getBean("aPI",API.class);
        api.print();
    }
}

我们之前说BeanName默认小驼峰 但是当类名是API这种时,使用小驼峰不能获取到对象?我们去研究AnnotationBeanNameGenerator类的源码(注解BeanName的生成)

?这个最终生成BeanName执行的方法,我们会发现这个方法是java类的方法,也就是说,最终生成BeanName的方法是由JDK提供的

调用这个方法,来检查这个结论:

也就说,API类的BeanName是API?

方法注解

@Bean:添加到方法上

Bean注解不可以直接加在类上

?方法注解是要加在方法上的,用来将返回的对象注册进Spring,也就是说这个方法,要返回一个Bean对象

public class BeanMethod {
    //加了Bean注解后,这个方法返回的User对象 将会被注册进入Spring
    @Bean
    public User init() {
        User user = new User();
        user.setName("zhangsan");
        return user;
    }
}
public class User {
    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

使用方法注解,BeanName默认是方法名?

?这时发现报错了,有两种可能性:1、User对象没注册进入Spring2、BeanName不正确

这个User对象只会注册一次,我们可以使用User user=context.getBean(User.class),来排查是什么原因,这时也发生了报错

也就说,User对象并未注册进入Spring框架

只使用一个Bean注解是无法将对象存储进入框架,必须搭配一个五大类注解

@Service
public class BeanMethod {
    //加了Bean注解后,这个方法返回的User对象 将会被注册进入Spring
    @Bean
    public User init() {
        User user = new User();
        user.setName("zhangsan");
        return user;
    }
}

?方法注解重命名

使用方法注解,BeanName默认使用方法名,可以利用方法注解的name属性起别名?

?不使用name属性时,BeanName默认方法名,使用name属性之后,BeanName只可以是name属性内的名称

获取Bean对象

对象装配:将对象取出来放到某一个类中,也称为对象注入

注入方式

对象装配的实现方式有三种:

1、属性注入 (使用@Autowired注解)

2、构造方法注入

3、Setter注入

属性注入

@Controller
public class UserApplication {
  @Autowired
    private User user;

    public void print() {
        System.out.println("user -》" + user);
    }
}

@Autowired
private User user;

这个代码的意思是,告诉Spring,在加载?UserApplication类时,要先将User对象注入到user这个属性中,也就是要先得到User对象

构造方法注入?

@Controller
public class UserController {
    private User user;

    @Autowired
    public UserController(User user) {
        this.user = user;
    }

    public void print() {
        System.out.println(user.getName());
    }
}

在调用UserController类时,执行构造方法,构造方法执行时,@Autowired注解告诉Spring,要先将User对象注入到user这个属性中,也就是要先得到User对象

setter方法注入

@Controller
public class UserController {
    private User user;

    @Autowired
    public void setUser(User user) {
        this.user = user;
    }

    public void print() {
        System.out.println(user.getName());
    }
}

三种注入的区别

1、属性注入是最简单的,但是这个注入只适用于IoC容器

2、setter注入,是官方早期推荐使用的写法,但是其他语言的setter()方法写法可能不同,通用性不高

3、构造方法注入,是现在官方推荐的写法,其他语言的构造方法基本一致,通用性更高,但是构造方法的参数可能更多,需要注意

Resource注解

?@Autowired注解是由spring实现的,而jdk也有对 对象注入的实现:@Resource注解

两个的区别

1、 @Autowired注解是先按照类型获取的 先找User类;@Resource注解先按照名称获取 先找user这个变量名称 后找User类

  @Resource
    private User user;

2、?@Resource注解不支持构造方法注入;支持属性注入和setter方法注入

3、@Autowired()只支持requied参数设置,?@Resource注解支持很多参数设置

同一个类型被注入多次

此时,要在框架找一个User类型的对象,然后发现存在两个user1和user2,报错

?解决方法

1:使用@Resource注解,精确描述BeanName名称,就直接和方法注解的BeanName对应

@Controller
public class UserApplication {
    @Resource
    private User user1;

    public void print() {
        System.out.println("user -》" + user1);
    }
}

2、使用@Resource注解,使用name属性重命名

@Controller
public class UserApplication {
    @Resource(name = "user1")
    private User user;

    public void print() {
        System.out.println("user -》" + user);
    }
}

3、@Autowired 搭配@Qualifier注解?@Qualifier注解用于定义名称

@Controller
public class UserApplication {
  @Autowired @Qualifier("user1")
    private User user;

    public void print() {
        System.out.println("user -》" + user);
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:42:44  更:2022-09-24 20:43:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 8:47:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码