Spring注解与P/C命名空间超详细解析

目录
  • 注解实现自动装配
    • @Autowire注解
    • @Qualifier注解
    • @Resource注解
    • @Component
    • @Scope
    • @ComponentScan
    • @Bean
    • @Configuration
    • @Value
  • P命名空间注入
  • C命名空间注入
  • Spring开发包名解释
  • Java方式配置

注解实现自动装配

@Autowire注解

@Autowire注解,自动装配通过类型,名字如果Autowire不能唯一自动装配上属性,

则需要通过@Qualifier(value=“xxx”)

配置:

导入约束

<?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:context="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
       http://www.springframework.org/schema/context/spring-context.xsd
        ">

开启注解支持

<context:annotation-config/>

实现:

Dog/Cat类和方法的实现还是不变

People类

  • 实现@Autowire注解、可以在属性上使用、也可以在set方式使用
  • 编写@Autowire注解后,set方法可以省略不写
public class People {
    @Autowired
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;
}

beans.xml

    <bean id="cat" class="com.wei.pojo.Cat"/>
    <bean id="dog" class="com.wei.pojo.Dog"/>
    <bean id="people" class="com.wei.pojo.People"/>

@Nullable 字段标记了这个注解,说明这个字段可以为null

可以在带参构造中使用@Nullable

    public People(@Nullable String name) {
        this.name = name;
    }

@Qualifier注解

指定一个唯一的bean对象注入

People类

public class People {
    @Autowired
    @Qualifier(value = "cat111")
    private Cat cat;
    @Autowired
    @Qualifier(value = "dog222")
    private Dog dog;
    private String name;
}

beans.xml

    <bean id="cat" class="com.wei.pojo.Cat"/>
    <bean id="cat111" class="com.wei.pojo.Cat"/>
    <bean id="dog" class="com.wei.pojo.Dog"/>
    <bean id="dog222" class="com.wei.pojo.Dog"/>
    <bean id="people" class="com.wei.pojo.People"/>

@Resource注解

默认按照名字装配Bean,即会按照name属性的值来找到具有相同id的Bean Definition 并注入

People类

public class People {
    @Resource(name = "cat2")
    private Cat cat;
    @Resource
    private Dog dog;
    private String name;
}

beans.xml

<bean id="cat1" class="com.wei.pojo.Cat"/>
<bean id="cat2" class="com.wei.pojo.Cat"/>
<bean id="dog" class="com.wei.pojo.Dog"/>
<bean id="people" class="com.wei.pojo.People"/>

总结:

  • @Autowire 通过byType方式实现,而且必须要求对象存在,不能为null
  • @Resource 默认通过byname的方式实现,如果找不到名字,则通过byType实现,都不行则报错

@Component

放在类上,说明这个类被Spring管理了,等同于bean配置

Java类

此处使用注解@Component @Value 则 beans.xml则无需书写bean

//等价于<bean id="user" class="com.wei.pojo.User       Component:组件
@Component
public class User {
    @Value("wei_shuo")  //相当于 <property name="name" value="wei_shuo"/>
    public String name;
}

@Component的衍生注解,在web开发中,按照MVC三层架构分层

四个注解功能、作用相同,都是代表将某个类注册到Spring中、装配Bean

  • pojo —> @Component
  • dao —> @Resource
  • service —> @Service
  • controller —> @Controller

@Scope

作用域注解,限定Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围

@ComponentScan

@ComponentScan(“com.wei.pojo”) 扫描包

@Bean

  • 注册一个bean,就相当于bean标签
  • 方法的名字,相当于bean标签的id属性
  • 方法的返回值,相当于bean标签的class属性
    @Bean
    public User getUser(){
        return new User();      //就是返回要注入到bean的对象
    }

@Configuration

@Configuration注解会被Spring容器托管,因为它本身就是一个@Component

@Configuration 代表这是一个配置类,相当于beans.xml

@Configuration
@ComponentScan("com.wei.pojo")
@Import(WeiConfig2.class)
public class WeiConfig {
    @Bean
    public User getUser(){
        return new User();
    }
}

@Value

属性注入值

Java类

此处使用@Scope注解使用prototype多实例注解模式

//等价于<bean id="user" class="com.wei.pojo.User       Component:组件
@Component
@Scope("prototype")		//作用域注解
public class User {
    @Value("wei_shuo")  //相当于 <property name="name" value="wei_shuo"/>
    public String name;
}

P命名空间注入

p命名空间注入,对应Set注入方式

需要创建set/get方法

p命名空间注入,可以直接注入属性的值:property

User类

package com.wei.pojo;
public class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

userbeans.xml文件

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!--上面添加 xmlns:p="http://www.springframework.org/schema/p" -->
    <!--p命名空间注入,可以直接注入属性的值:property-->
    <bean id="user" class="com.wei.pojo.User" p:name="秦疆" p:age="18"/>
</beans>

Test测试

        ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
//        指定类型User.class则不需要强制转换
        User user = context.getBean("user", User.class);
//        强制转换
//        User user = (User) context.getBean("user");
        System.out.println(user);

C命名空间注入

c命名空间注入,对应构造器注入

需要创建无参/带参构造方法

c命名空间注入,通过构造器 注入:construct-args

User类

此处增加无参/带参构造方法

public class User {
    private String name;
    private int age;
    public User() {
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

userbeans.xml文件

<?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:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!--上面添加  xmlns:c="http://www.springframework.org/schema/c" -->
    <!--c命名空间注入,通过构造器 注入:construct-args-->
    <bean id="user2" class="com.wei.pojo.User" c:name="wei_shuo" c:age="18"/>
</beans>

Test测试

        ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
        User user = context.getBean("user2", User.class);
        System.out.println(user);

总结:

p命名空间注入/c命名空间注入 都需要导入xml约束,不能直接使用

xmlns:p=“http://www.springframework.org/schema/p”

xmlns:c=“http://www.springframework.org/schema/c”

Spring开发包名解释

dao包

数据库操作,crud 即增删改查,对于数据库的增删改查的操作都在这里

pojo包

简单java对象

service包

service 服务器层,也叫业务逻辑层,调用dao中的方法

Java方式配置

使用Java的方式配置Spring,也就是不写bean.xml配置,使用注解代替

实体列

//@Configurable放在类上,说明这个类被Spring管理了,等同于bean配置,注册到容器中
@Configurable
public class User {
    private String name;
    public String getName() {
        return name;
    }
    @Value("CSDN")  //属性注入值
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

配置文件

  • @Configuration注解会被Spring容器托管,因为它本身就是一个@Component
  • @Configuration 代表这是一个配置类,相当于beans.xml
  • @Import注解,功能就是和Spring XML里面的一样. @Import注解是用来导入配置类或者一些需要前置加载的类.通俗的将就是将类放入到IOC容器中
  • @Bean注解,注册一个bean,就相当于bean标签,方法的名字,相当于bean标签的id属性,方法的返回值,相当于bean标签的class属性
//@Configuration注解会被Spring容器托管,因为它本身就是一个@Component
//@Configuration 代表这是一个配置类,相当于beans.xml
@Configuration
@ComponentScan("com.wei.pojo")      //扫描包
@Import(WeiConfig2.class)           //@Import注解,功能就是和Spring XML里面的一样. @Import注解是用来导入配置类或者一些需要前置加载的类.通俗的将就是将类放入到IOC容器中
public class WeiConfig {
    //注册一个bean,就相当于bean标签
    //方法的名字,相当于bean标签的id属性
    //方法的返回值,相当于bean标签的class属性
    @Bean
    public User getUser(){
        return new User();      //就是返回要注入到bean的对象
    }
}

测试类

public class MyTest {
    //如果完全使用了配置类方式去做,只能通过AnnotationConfig 上下文来获取容器,通过配置类的class对象加载
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(WeiConfig.class);
        User getUser = (User) context.getBean("getUser");   //此处取方法名
        System.out.println(getUser.getName());
    }
}

到此这篇关于Spring注解与P/C命名空间超详细解析的文章就介绍到这了,更多相关Spring注解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring注解Autowired的底层实现原理详解

    目录 一.Autowired注解的用法 1.概述 2.应用 3.具体用法 二.Autowired自动装配的过程 一.Autowired注解的用法 1.概述 使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式. spring技术自身也在不断的发展和改变,从当前springboot的火热程度来看,java config的应用是越来越广泛了,在使用java config的过程当中,我们不可避免的会有各种各样的注解打交道,其中,我们使用最多的注解应该就是@

  • Spring @Conditional注解示例详细讲解

    目录 前言: 示例: 标注在方法上: 标注在类上: 多个条件类: 前言: @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. @Conditional的定义: //此注解可以标注在类和方法上 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditi

  • Spring框架基于注解的AOP之各种通知的使用与环绕通知实现详解

    目录 一.基于注解的AOP之各种通知的使用 二.基于注解的AOP之环绕通知 一.基于注解的AOP之各种通知的使用 1.在切面中,需要通过指定的注解将方法标识为通知方法 @Before:前置通知,在目标对象方法执行之前执行 @After:后置通知,在目标对象方法的finally子句中执行 @AfterReturning:返回通知,在目标对象方法返回值之后执行 @AfterThrowing:异常通知,在目标对象方法的catch子句中执行 声明重用写入点表达式 @Pointcut("execution

  • Spring中Transactional注解使用的心得(推荐)

    事务特性 @Transactional注解是用于事务控制的,需要知道事务的ACID特征:即原子性(Atomicity,或称不可分割性).一致性(Consistency).隔离性(Isolation,又称独立性).持久性(Durability). 事务是用来控制数据的ACID特性的,用于保证数据的正确性和完整性. @Transactional注解有两种使用方式: (1)标注在类上面:当作用于类上时,该类的所有public方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别

  • 一文带你了解SpringBoot中常用注解的原理和使用

    目录 @AutoConfiguration @Import @ConfigurationProperties @AutoConfiguration 读取所有jar包下的 /META-INF/spring.factories 并追加到一个 LinkedMultiValueMap 中.每一个url中记录的文件路径如下: file:/C:/Users/wangchao/apache-maven-3.5.0/repo/com/baomidou/mybatis-plus-boot-starter/3.5.

  • 浅析Spring基于注解的AOP

    目录 一.准备工作 二.基于注解的AOP之前置通知 三.基于注解的AOP之切入点表达式的语法和重用以及获取连接点的信息 ①切入点表达式的语法 ②获取连接点的信息 ③重用写入点表达式 一.准备工作 ①创建一个Maven工程 ②添加依赖 在IOC所需依赖基础上再加入下面依赖即可: <!-- spring-aspects会帮我们传递过来aspectjweaver --> <dependency> <groupId>org.springframework</groupId

  • SpringBoot Application核心注解详解

    目录 @SpringBootApplication @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan @SpringBootApplication @SpringBootApplication 是一个“三体”结构,实际上它是一个复合 Annotation: ​ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @In

  • Spring中@order注解用法实战教程

    目录 前言 一.观察@order源码 二.@order实战 三.@order失效原因 四.解决排序问题 五.排序源码分析 六.@AutoConfigureOrder 总结 前言 @order注解是spring-core包下的一个注解,@Order的作用是定义Spring IOC容器中Bean的执行顺序的优先级(这里的顺序也可以理解为存放到容器中的先后顺序).开发过程当中有时候经常会出现配置依赖关系,例如注入A对象使用了 @ConditionalOnBean(B.class),意思是要求容器当中必

  • Spring Boot日志的打印与持久化详细解析

    目录 1. 日志有什么用 2. 日志怎么用 3. Spring Boot 自定义日志的打印 3.1 先获取到打印日志对象 3.2 使用日志对象打印日志 3.3 日志格式说明 4. 日志级别 5. 日志持久化(将日志永久的保存到磁盘的某个位置) 设置日志的保存路径 6. 更简单的日志输出—lombok 6.1 添加 lombok 到当前项目 6.2 使用 @Slf4j 得到日志对象 log 总结 1. 日志有什么用 日志是程序的重要组成部分,想象一下,如果程序报错了,不让你打开控制台看日志,那么你

  • SpringBoot + Spring Cloud Consul 服务注册和发现详细解析

    什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式",内置了服务注册与发现框架.分布一致性协议实现.健康检查.Key/Value 存储.多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等).使用起来也较为简单.Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux.windows和Mac OS X):安装包仅包含一个可执行文件

  • Go语言单元测试超详细解析

    目录 一.单元测试分类及其概念 1.基本分类 2.细说单元测试分类 二.结合代码细说每一种测试 1.基准测试 2.组测试与子测试 三.pprof调试工具 1.对主函数进行传参 2.pprof性能调优 前言: 平时根据需求写代码.人工进行测试往往不会面面俱到,还会因为需求的改变繁琐的进行测试通过完成一个测试函数,可以大大简化测试的步骤,并且在需求该变的时候只需要改变一下测试的输入与期望 一.单元测试分类及其概念 1.基本分类 测试函数 函数前缀为Test 主要用于测试程序的一些逻辑行为是否正确 基

  • 超详细解析C++实现快速排序算法的方法

    目录 一.前言 1.分治算法 2.分治算法解题方法 二.快速排序 1.问题分析 2.算法设计 3.算法分析 三.AC代码 一.前言 1.分治算法 快速排序,其实是一种分治算法,那么在了解快速排序之前,我们先来看看什么是分治算法.在算法设计中,我们引入分而治之的策略,称为分治算法,其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题,分而治之. 2.分治算法解题方法 1.分解: 将要解决的问题分解为若干个规模较小.相互独立.与原问题形式相同的子问题. 2.治理: 求解各个子问题.由于各个子

  • 超详细解析C++实现归并排序算法

    目录 一.前言 分治算法 分治算法解题方法 二.归并排序 1.问题分析 2.算法设计 3.算法分析 三.AC代码 一.前言 分治算法 归并排序,其实就是一种分治算法 ,那么在了解归并排序之前,我们先来看看什么是分治算法.在算法设计中,我们引入分而治之的策略,称为分治算法,其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题,分而治之. 分治算法解题方法 1.分解: 将要解决的问题分解为若干个规模较小.相互独立.与原问题形式相同的子问题. 2.治理: 求解各个子问题.由于各个子问题与原问题

  • Spring注解 TX声明式事务实现过程解析

    环境搭建导入 maven依赖 <!--spring提供的数据库操作工具--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!--c3p0 数据库连接池--> &

  • Spring注解@EnableWebMvc使用的坑点及解析

    目录 Spring注解@EnableWebMvc使用坑点 @enablewebmvc注解有什么用途 Spring注解@EnableWebMvc使用坑点 通过注解的方式来进行Spring4 MVC开发时,我们都会在配置文件中加入<mvc:annotation-driven/>标签,这个配置会自动注册了一个 RequestMappingHandlerMapping.一个RequestMappingHandlerAdapter.以及一个ExceptionHandlerExceptionResolve

  • spring+springmvc+mybatis+maven入门实战(超详细教程)

    入门篇 本篇文章涉及到的技术有spring.springmvc.mybatis.mysql.xml.maven.jsp.javase.javaweb.eclipse 下面开始本篇文章的教程 一.新建maven项目 一般通过这种方法新建maven项目 假如你的eclipse不能通过上面的方法新建maven项目,也可以通过下面的方法新建maven项目 看到下面的项目结构,说明你已经成功创建了一个maven项目.但是这个项目报错,根据标准的web项目结构来说,目前这个项目缺少了web.xml 利用ec

  • C++带头双向循环链表超详细解析

    目录 什么是带头双向循环链表 带头双向循环链表常用接口实现 上期我们讲完了无头单向非循环链表,这期我们接着来讲链表中结构最复杂的带头双向循环链表! 本期主要内容: 什么是带头双向循环链表? 带头双向循环链表常用接口实现! 顺序表和链表的区别和联系! 什么是带头双向循环链表 什么是带头?双向?循环?(带头双向循环链表) 带头:代表链表存在一个哨兵位节点,也就是头节点,这个节点不存放任何的有效数据! 双向:每个节点都有两个指针,分别指向它的前一个节点和后一个节点! 循环:最后一个节点next不再指向

  • C++ 二叉树的实现超详细解析

    目录 1.树的概念及结构(了解) 1.1树的概念: 1.2树的表示法: 2.二叉树的概念及结构 2.1二叉树的概念: 2.2特殊的二叉树: 2.3二叉树的性质: 2.4二叉树的顺序存储: 2.5二叉树的链式存储: 3.二叉树链式结构的实现 3.1二叉树的前中后序遍历: 3.2求二叉树的节点个数: 3.3求二叉树的叶子节点个数: 3.4销毁二叉树: 1.树的概念及结构(了解) 1.1树的概念: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因为它看

随机推荐