分享好友 编程语言首页 频道列表

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

C/C++教程  2023-02-09 05:140

注解实现自动装配

@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());
    }
}
原文地址:https://weishuo.blog.csdn.net/article/details/127456652

查看更多关于【C/C++教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
Springboot + mybatis + React+redux+React-router+antd+Typescript(二): React+Typescrip项目的搭建
前言:            后台搭建完以后开始搭建前端,使用create-react-app搭建项目非常方便。           前端主要是如何向后台请求数据,以及如何使用redux管理state,路由的配置.           前端github地址:  https://github.com

0评论2023-02-09413

微信小程序 springboot nginx 做图片存储 上传 浏览
微信小程序前端-springboot后端-nginx图片存储前言本人小白一名,这是第一次学习微信小程序,特此做个记录。首先准备nginx做图片存储选择一个地址存放图片#我的地址[root@VM_0_16_centos images]# pwd/home/photos/images[root@VM_0_16_centos images]#然后配

0评论2023-02-09533

Ruby中文乱码问题 springmvc中文乱码
中文乱码问题解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*-(EMAC写法) 或者 #coding=utf-8 就行了。源代码文件中,若包含中文编码,则需要注意两点:1. 必须在首行添加 # -*- coding: UTF-8 -*-,告诉解释器使用utf-8来解析源码。2. 必须设置编

0评论2023-02-09738

SpringBoot + nodeJS + zookeeper 搭建微服务示例
总体来说该项目由服务注册 + 服务发现 + 服务代理 + 服务调用四部分组成。使用java客户的开发服务注册组件,它是整个微服务架构中的服务注册表,使用Node.js客户端开发服务发现组件,它用于在服务注册表中根据具体的服务名称获取对应的服务配置。  由项目1

0评论2023-02-09398

SpringBoot使用过滤器、拦截器和监听器的案例代码(Springboot搭建java项目)
目录SpringBoot使用过滤器、拦截器和监听器一、SpringBoot使用过滤器Spring boot过滤器的使用(两种方式)方式一:方式二:二、SpringBoot使用拦截器三、过滤器和拦截器的执行顺序四、SpringBoot使用监听器1、统计网站最多在线人数监听器的例子2、springboot

0评论2023-02-09751

spring-data-redis 自定义缓存(@annotation+lua+aop)(一)
介绍:使用spring-data-redis 框架 ,利用@annotation和redis lua,spring aop 实现数据的 save、list、update、delete对缓存的影响操作(考虑增加异步数据)  save:数据库数据添加、缓存数据添加、list后的缓存数据添加  list:缓存数据增加  update:数

0评论2023-02-08436

SpringMVC文件上传多文件上传实例
这篇文章主要介绍了SpringMVC文件上传 多文件上传实例,有需要的朋友可以参考一下

0评论2015-07-16114

spring实现jdbctemplate添加事务支持示例
这篇文章主要介绍了spring实现jdbctemplate添加事务支持示例,重写JdbcTemplate增加beginTranstaion,commit,rollback方法,需要的朋友可以参考下

0评论2015-06-26148

通过spring用beanshell实现java接口示例
这篇文章主要介绍了通过spring用beanshell实现java接口示例,需要的朋友可以参考下

0评论2015-06-26105

spring动态bean注册示例分享
这篇文章主要介绍了spring动态bean注册示例,需要的朋友可以参考下

0评论2015-06-26144

更多推荐