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基于注解开发总结

前言

Spring是我们开发中的核心框架,传统的xml配置文件十分繁琐,所以在Spring2.5以后,程序员可以使用注解来配置依赖注入,而不是大量的在xml文件中配置,我们可以使用相关类、方法或字段的注解,将繁琐的xml配置移植到类本身。

方式一:半注解半xml配置文件实现依赖注入

首先,先来介绍一些必要的注解及其使用。
@Component
该注解使用于类上面,相当于配置文件中的:

<bean class=""/>

那么如何给bean的id赋值呢?我们不妨从@Component源代码中寻找答案

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	String value() default "";

}

可以看到,类中有一个value属性,而且默认为"",它就表示bean的id属性。当我们需要给bean赋id值的时候,我们通过在注解中给value赋值。比如:

@Component(value = “xxx”)

也可以这样写:

@Component(“xxx”)

@Component泛指各种组件,此注解还衍生出了三个和它一样的注解:
@Controller 一般用于表现层(web层)的注解
@Service 一般用于业务层(service层)的注解
@Repository 一般用于持久层(dao层)的注解
@Scope
@Scope注解的作用就是来调节对象的作用域。
此注解可以指定五种作用域

1. singleton单例模式(默认)
仅有一个该类的实例
2. prototype在这里插入代码片原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3. request
每一次http请求都会产生一个新的bean,作用域相当于servlet中的request作用域
4. session
每一次http请求都会产生一个新的bean,作用域相当于servlet中的session作用域
5. global session
在web中相当于session类型

举例
我们以学生和学校为例,先创建学校类School:

@Component("school")
public class School {
    @Value("bju")
    private String name;

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

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

创建学生类Student:

@Component("student")
@Scope(value = "prototype")
public class Student {
    @Value("zhangsan")
    private String name;
    @Value("15")
    private int age;
    @Resource(name = "school")
    private School school;

    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;
    }

    public School getSchool() {
        return school;
    }

    public void setSchool(School school) {
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }
}

需要注意的是xml配置文件:

	<context:annotation-config></context:annotation-config>
    <context:component-scan base-package="com.jiawen"/>

这两项配置缺一不可,有了它们,Spring才会扫描并识别出你的注解。
测试代码:

	@Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);
    }

运行结果:

Student{name=‘zhangsan’, age=15, school=School{name=‘bju’}}

方式二:全注解实现依赖注入

同样,我们介绍一下必要的注解及其使用。
@Configuration
Configuration的主要功能是用来注册Bean,它使用在类的上面,相当于一个Spring的XML配置文件,与@Bean配合使用。
@Bean
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
可以通过@Bean(name = “xxx”)的方式来指定bean的id属性
@Bean需要在@Configuration注解下的类使用。
@ComponentScan
此注解相当于xml配置文件中的 <context:component-scan base-package="com.jiawen"/>
使用此注解时,我们要指定base-package属性,用法为:

@ComponentScan(basePackages = “xxx.xxxx…”)

举例
我们仍以学校和学生为例,上文中的School和Student类不变,我们新增加一个beans类:

@Configuration
@ComponentScan(basePackages = "com.jiawen")
public class beans {
    @Bean(name = "school")
    public School getSchool(){
        return new School();
    }

    @Bean(name = "student")
    public Student getStudent(){
        return new Student();
    }
}

测试代码:

	@Test
    public void test(){
        ApplicationContext context = new AnnotationConfigApplicationContext(beans.class);
        Student student = (Student) context.getBean("student");
        System.out.println(student);
    }

与上种方式测试代码不同的是,这次我们使用了AnnotationConfigApplicationContext,当我们使用全注解开发时,就不能再使用ClassPathXmlApplicationContext了。
运行结果:

Student{name=‘zhangsan’, age=15, school=School{name=‘bju’}}

总结

基于注解开发是我们必须要掌握的技能,无论是全xml配置、半注解半xml配置还是全注解方式,都有它的优点与弊端。我们在实际开发中,千万不能“随自己喜欢的方式”或者“图方便”,一定要根据项目的具体情况来决定用哪种方式。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 14:57:12  更:2021-08-20 14:59:19 
 
开发: 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年5日历 -2024/5/21 3:42:43-

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