深入分析JavaWeb Item52 -- Spring注解Annotation_context annotation-config 标签红色出错

import org.junit.Test;

public class AnnotationTest {
public static void test(){
/**
* 如果解析类的注解,先得到Class
* 如果解析方法的注解,先得到method
*/
Class class1 = Itheima10.class;
//判断类上面是否有ClassInfo注解
if(class1.isAnnotationPresent(ClassInfo.class)){
//得到类上面的注解
ClassInfo classInfo = (ClassInfo)class1.getAnnotation(ClassInfo.class);
System.out.println(classInfo.value());
System.out.println(classInfo.name());
}

    Method[] methods = class1.getMethods();
    for (Method method : methods) {
        //正在遍历的方法上面是否存在MethodInfo注解
        if(method.isAnnotationPresent(MethodInfo.class)){
            MethodInfo methodInfo = method.getAnnotation(MethodInfo.class);
            System.out.println(methodInfo.name());
            System.out.println(methodInfo.value());
        }
    }
}

@Test
public void test(){
    AnnotationTest.test();
}

}


##### **2、spring中的注解**


spring框架为我们提供了注解功能。


使用注解编程,主要是为了替代xml文件,使开发更加快速。但是,xml文件的使用就是解决修改程序修改源代码,现在又不去使用xml文件,那么不就违背了开闭原则了么,得确是。不过么,注解也有注解的好,使用注解就不用配置那么多的xml文件啦,最重要的是开发效率高。。


在没有使用注解时,spring框架的配置文件applicationContext.xml文件中需要配置很多的`<bean>`标签,用来声明类对象。使用注解,则不必在配置文件中添加标签拉,对应的是在对应类的“注释”位置添加说明。具体介绍如下:


* 1. **`@Resource`** 对象间关系的组合,默认采用的是按名称方式进行装配,如果根据名称查找不到关联的对象,那么会再采用按类型继续查找。如果没有指定name属性,


• 当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象   
 • 当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。 


![这里写图片描述](https://img-blog.csdn.net/20160114221209953)


• 注意:如果没有指定name属性,并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。


* **2. `@Autowired`**   
 @Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
* 3、 **`@Qualifier`**   
 如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。


1,使用注解,需要在配置文件中增加命名空间和约束文件步骤:


引入context命名空间



<beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns:context=“http://www.springframework.org/schema/context”

http://www.springframework.org/schema/context/spring-context-2.5.xsd">


2、 在配置文件中加入context:annotation-config标签



context:annotation-config</context:annotation-config>


**实例演示:**


编写一个Person类,其中有一个student属性,以及一个say()方法,代码如下



package com.itheima10.spring.di.annotation;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

/**
* @Autowired//按照类型进行匹配
*
* @Autowired//按照类型进行匹配
@Qualifier(“student”)
*
*/
public class Person {
@Resource(name=“student”)
private Student student;

public void say(){
    this.student.say();
}

}


Student类代码如下



package com.itheima10.spring.di.annotation;

public class Student {
public void say(){
System.out.println(“student”);
}
}


配置applicationContext.xml文件



<?xml version="1.0" encoding="UTF-8"?>







context:annotation-config</context:annotation-config>


编写测试类AnnotationTest 



package com.itheima10.spring.di.annotation;

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

/**
* 原理:
* 1、启动spring容器
* 2、把person和student两个bean实例化
* 3、当spring容器解析到
* context:annotation-config</context:annotation-config>
* 就会启动依赖注入的注解解析器
* 4、spring容器会在纳入spring管理的bean的范围内查找,看这些类的哪些属性上加有@Resource注解
* 5、如果某一个属性上加有@Resource注解
* 会查看该注解的name属性的值是否为""
* 如果为"“,则会把该注解所在的属性的名称和spring容器中的id的值作匹配,如果匹配成功,则赋值
* 如果匹配不成功,则按照类型进行匹配,匹配成功则赋值
* 如果再匹配不成功,则报错
* 如果不为”",则把该注解的name属性的值和spring容器中id的值作匹配,如果匹配成功,则赋值
* 如果匹配不成功,则直接报错
*
说明:
注解只能作用于引用类型
xml与注解的对比
xml的效率比较高,书写比较麻烦
注解的书写比较简单,效率比较低
*
*/
public class AnnotationTest {
@Test
public void testAnnotation(){
ApplicationContext context =
new ClassPathXmlApplicationContext(“applicationContext.xml”);
Person person = (Person)context.getBean(“person”);
person.say();
}
}


如果使用注解,就不需要在配置文件中装载person和student了,这样就可以简化配置文件的编写。


##### **3、 扫描**


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


**1、引入context命名空间** 


在xml配置文件中添加`context:component-scan`标签 


其中**base-package**为需要扫描的包(含子包)。


**实例:**   
 将上述实例用扫描的方式书写如下



@Component
public class Person {
@Resource(name=“student”)
private Student student;

public void say(){
    this.student.say();
}

}



@Component
public class Student {
public void say(){
System.out.println(“student”);
}
}


applicationContext.xml只需配置一句话



 <!-- 

component 组件
把一个类放入到spring容器中,该类就称为组件
在base-package指定的包及子包下扫描
–>
<context:component-scan base-package=“com.itheima10.spring.scan”></context:component-scan>


编写测试类AnnotationTest 



/**
* 原理
* 1、启动spring容器
* 2、spring容器解析
* <context:component-scan base-package=“com.itheima10.spring.scan”>
</context:component-scan>
3、在base-package指定的包及子包中扫描,看哪些类上面是否含有@Component注解
4、如果有该注解
@Component
public class Person {
}
==等价于

@Component(“aa”)
public class Person {
}
==等价于

5、按照@Resource的解析步骤执行
说明:
整个过程扫描两次,效率越来越低,书写越来越简单
*
*
*/
public class AnnotationTest {
@Test
public void testAnnotation(){
ApplicationContext context =
new ClassPathXmlApplicationContext(“applicationContext.xml”);
Person person = (Person)context.getBean(“person”);
person.say();
}
}


**实例再现**


我们将Item51中最后的文档管理系统用注解的方式改一下,Document接口不变,有read和write方法,实现类分别如下ExcelDocument ,PDFDocument ,WordDocument 。



@Component(“excelDocument”)
public class ExcelDocument implements Document{

public void read() {
    System.out.println("excel read");
}
public void write() {
    System.out.println("excel write");
}

}



@Component(“pdfDocument”)
public class PDFDocument implements Document{

public void read() {
    System.out.println("pdf read");
}
public void write() {
    System.out.println("pdf write");
}

}



@Component(“wordDocument”)
public class WordDocument implements Document{

public void read() {
    System.out.println("word read");
}
public void write() {
    System.out.println("word write");
}

}


DocumentManager 



@Component(“documentManager”)
public class DocumentManager {
@Resource(name=“excelDocument”)
private Document document;

public void read(){
    this.document.read();
}

public void write(){
    this.document.write();
}

}


配置文件



<context:component-scan base-package="com.itheima10.spring.iocdi.document">
</context:component-scan>

编写测试类DocumentTest 



public class DocumentTest {
@Test
public void testDocument(){
ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);
DocumentManager documentManager = (DocumentManager)context.getBean(“documentManager”);
documentManager.read();
documentManager.write();
}
}


**2、其他注解功能介绍**   
 **@Service**用于标注业务层组件、服务层注解   
 **@Controller**用于标注控制层组件(如struts中的action)、控制层注解   
 **@Repository**用于标注数据访问组件,即DAO组件。持久层注解


而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 


**实例重现–MVC案例**




# 复习的面试资料

> 这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)
>

 *   **第一部分:Java基础-中级-高级**

![image](https://img-blog.csdnimg.cn/img_convert/afe8faba301c6bd1646b7b65bd280d1c.webp?x-oss-process=image/format,png)

*   **第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)**

![image](https://img-blog.csdnimg.cn/img_convert/71d8035bac82fdff84878ba182ed2a32.webp?x-oss-process=image/format,png)

*   **第三部分:性能调优(JVM+MySQL+Tomcat)**

![image](https://img-blog.csdnimg.cn/img_convert/dcb60922723b913d17f2e3b9a1f2480d.webp?x-oss-process=image/format,png)

*   **第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)**

![image](https://img-blog.csdnimg.cn/img_convert/04177ebee792be03761cb9b237adefa5.webp?x-oss-process=image/format,png)

*   **第五部分:微服务(SpringBoot+SpringCloud+Dubbo)**

![image](https://img-blog.csdnimg.cn/img_convert/995738224d7a7b3cbc720c8915146d1d.webp?x-oss-process=image/format,png)

*   **第六部分:其他:并发编程+设计模式+数据结构与算法+网络**

![image](https://img-blog.csdnimg.cn/img_convert/75f3241af6320a7c71363f5f6cde6e27.webp?x-oss-process=image/format,png)

# 进阶学习笔记pdf

>*   **Java架构进阶之架构筑基篇(**Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法**)**

![image](https://img-blog.csdnimg.cn/img_convert/6eb1310d040ea245d754015c8f12b734.webp?x-oss-process=image/format,png)

*   **Java架构进阶之开源框架篇(**设计模式+Spring+SpringMVC+MyBatis**)**

![image](https://img-blog.csdnimg.cn/img_convert/7b82311d8ab9a99d76c5666dce43312b.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/0a71d838ffed79337d8a31e61d2252c1.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/f1906cc5cfbaba114ddc6b6760f61685.webp?x-oss-process=image/format,png)

*   **Java架构进阶之分布式架构篇 (**限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)**)**

![image](https://img-blog.csdnimg.cn/img_convert/2a8decba0021a450912653842fc1c4f9.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/df3260332cbe695e8611b92d6a1eb2ca.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/0fac21e8c20a2700d03607ef6b3b9893.webp?x-oss-process=image/format,png)

*   **Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)**

![image](https://img-blog.csdnimg.cn/img_convert/b78d2d20f2dfcce190a8ab958e27f7b8.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/58ea37724d9232698474e8d09e101037.webp?x-oss-process=image/format,png)



j-1714204606293)]

[外链图片转存中...(img-GZSvufPV-1714204606293)]

[外链图片转存中...(img-fNakQScc-1714204606293)]

*   **Java架构进阶之分布式架构篇 (**限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)**)**

[外链图片转存中...(img-SGUzQlpS-1714204606293)]

[外链图片转存中...(img-Xm8FYjC6-1714204606294)]

[外链图片转存中...(img-3HCfxAki-1714204606294)]

*   **Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)**

[外链图片转存中...(img-5BiYCj11-1714204606294)]

[外链图片转存中...(img-JAwxEFuG-1714204606294)]



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值