Spring第五天(注解开发)

这篇具有很好参考价值的文章主要介绍了Spring第五天(注解开发)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注解配置Bean

Spring第五天(注解开发),spring,java,后端

首先,注解配置Bean时xml需要在写在context中,所以我们先来配置xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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:component-scan base-package="com.cacb"/>

</beans>

可以看到,与之前的Bean配置的区别为这种方法可以直接设置需要扫描的包,自动扫描包内注解了的Bean,那么下面就看如何注解类,以BookDao距离

package com.cacb.dao.impl;

import com.cacb.dao.BookDao;
import org.springframework.stereotype.Component;

@Component("bookDao")
public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("BookDao saving!");
    }
}

 可以看到,注解的部分为@Component("bookDao"),所以在获取该Bean时可以通过名称来访问

BookDao bookDao = (BookDao)cxt.getBean("bookDao");

那如果在注解时我没有给出名称呢?

package com.cacb.dao.impl;

import com.cacb.dao.BookDao;
import org.springframework.stereotype.Component;

@Component()
public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("BookDao saving!");
    }
}

此时,通过名称来访问显然是不成立的,此时可以用类型来访问

BookDao bookDao = (BookDao)cxt.getBean(BookDao.class);

@Component衍生注解

@Controller:         用于表现层Bean定义

@Service:             用于业务层Bean定义

@Respository:     用于数据层Bean定义

这三个注解方法与@component功能完全一致,只不过方便我们理解

纯注解开发模式

Spring3.0开启了纯注解开发模式,使用java类替代配置文件,开启了Spring快速开发赛道

Java类代替Spring核心配置文件Spring第五天(注解开发),spring,java,后端

以我上边用到的例子来演示

这是原来的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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:component-scan base-package="com.cacb"/>

</beans>

我们现在需要的是取缔掉书写较为复杂的xml文件,那么用什么代替他呢?

这里我们可以创建一个SpringConfig类来代替它,当然,还要用注解@Configuration来告诉系统这是配置文件,代码示例如下:

package com.cacb.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.cacb")
public class SpringConfig {
}

我们可以看到,代码中的 

@ComponentScan("com.cacb")

与原配置文件中的

        <context:component-scan base-package="com.cacb"/>

作用是相同的。

注意事项

@Configuration注解用于设定当前类为配置类

@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据要用数组格式

@ComponetScan({"com.cacb.dao","com.cacb.service"})

Bean生命周期的注解管理

Spring第五天(注解开发),spring,java,后端

为了使用注解来管理Bean的生命周期,我们以BookDao为例来通过注解为Bean的生命周期提供设置,代码如下:

 

package com.cacb.dao.impl;

import com.cacb.dao.BookDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Repository
@Component
@Scope("singleton")
public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("BookDao saving!");
    }

    @PostConstruct
    public void init(){
        System.out.println("BookDao init!");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("BookDao destroy");
    }
}

注解开发依赖注入

自动装配

引用类型

Spring第五天(注解开发),spring,java,后端

Spring第五天(注解开发),spring,java,后端 

解决了Bean的注解管理,下一步我们要解决的就是依赖注入的注解开发。

以BookDao和BookService为例

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    BookDao bookDao;


    public void save() {
        System.out.println("BookService saving!");
        bookDao.save();
    }
}

可以看到,基本与自动装配的xml文件写法一致,不过是改为了Autowired, 下面是一些注意事项

自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法

自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,需要提供唯一的构造方法

 但还有另一个问题,如果我们有两个类型相同的Bean需要同时加载呢?

先看解决代码:(假设有bookdao和boodao_这两个类型相同的bean需要注入,这里展示bookdao的注入)

bookdao:

package com.cacb.dao.impl;

import com.cacb.dao.BookDao;
import org.springframework.stereotype.Repository;

@Repository("bookDao")
public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println("BookDao saving!");
    }
}

bookservice

package com.cacb.service.impl;

import com.cacb.dao.BookDao;
import com.cacb.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;


@Service
public class BookServiceImpl implements BookService {
    @Autowired
    @Qualifier("bookDao")
    BookDao bookDao;


    public void save() {
        System.out.println("BookService saving!");
        bookDao.save();
    }
}

可以看到,这时我们一定要给bookdao设置名称,然后再Autowired后使用Qualifier("bookDao")来注解,这样就能解决问题。

注意:

@Qualifier注解无法单独使用,必须配合@Autowired注解使用

简单类型

方法很简单,直接上代码:

    @Value("cacb")
    private String name;

就是这样,不多赘述。

加载外部配置文件

Spring第五天(注解开发),spring,java,后端

以jbdc.properties文件的加载为例,文件内容如下:

name=cacb

要引入外部配置文件,我们肯定还是要修改配置类SpringConfig

直接给出注解:

@PropertySource("jbdc.properties")

路径仅支持单一文件配置,多文件需要使用数组格式配置,但不允许使用他通配符* 

 那么如果想用jbdc这个外部配置文件的name来对应我们在实现类中写的name呢?

实现方法如下,

    @Value(${name})
    private String name;

这样就能将外部配置文件的name传入文章来源地址https://www.toymoban.com/news/detail-809944.html

到了这里,关于Spring第五天(注解开发)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring注解开发 -- Spring入门(六)

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码可以在我主页的资源里找到,如果在学习的

    2024年02月16日
    浏览(37)
  • Spring 02 -Spring依赖注入+Spring注解开发

    依赖注入:在Spring创建对象的同时,为其属性赋值,称之为依赖注入。 创建对象时,Spring工厂会通过Set方法为对象的属性赋值。 范例:定义一个Bean类型 属性注入 范例:定义一个Bean类型 提供构造方法 构造方法注入 复杂类型指的是:list、set、map、array、properties等类型 定义

    2023年04月09日
    浏览(47)
  • 【Spring6】| Spring IoC注解式开发

    目录 一:Spring IoC注解式开发 1. 回顾注解 2. 声明Bean的四个注解 3. Spring注解的使用 4. 选择性实例化Bean 5. 负责注入的注解(重点) 5.1 @Value 5.2 @Autowired与@Qualifier 5.3 @Resource 6. 全注解式开发 注解的存在主要是为了简化XML的配置 ,Spring6倡导全注解开发。 我们来回顾一下:

    2023年04月12日
    浏览(49)
  • Spring注解开发 -- Spring快速入门保姆级教程(二)

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码可以在我主页的资源里找到,如果在学习的

    2024年02月09日
    浏览(48)
  • Spring学习笔记之Spring IoC注解式开发

    注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发 注解怎么定义,注解中的属性怎么定义? 注解怎么使用 通过反射机制怎么读取注解 注解怎么定义,注解中的属性怎么定义? 以上是自定义了一个注解:Component 该注解上面修饰的注解包括:Target注解和Retention注解,

    2024年02月12日
    浏览(44)
  • 11Spring IoC注解式开发(下)(负责注入的注解/全注解开发)

    负责注入的注解,常见的包括四个: @Value @Autowired @Qualifier @Resource 当属性的类型是简单类型时,可以使用@Value注解进行注入。 @Value注解可以出现在属性上、setter方法上、以及构造方法的形参上, 方便起见,一般直接作用在属性上. 配置文件开启包扫描: 测试程序: 三种方法都可

    2024年01月16日
    浏览(48)
  • spring注解驱动开发(一)

    Spring常用注解(绝对经典) 1、需要导入的spring框架的依赖 2、@Configuration 设置类为配置类 3、AnnotationConfigApplicationContext 通过配置类获取上下文环境applicationContext 可以通过getBeanDefinitionNames()获得配置类中配置的各类Bean 也可以使用getBeanNamesForType()通过类型来获得bean的name(id)

    2024年02月14日
    浏览(38)
  • 【Spring】纯注解开发

            在Spring3.0升级了纯注解开发模式,使用Java类来代替配置文件,开启了Spring快速开发赛道。 @Component         @Service         @Controller         @Repository         使用@Configuration声明一个配置类,使用@ComponentScan来扫描作为bean的类。         最后使用AnnotationConfig

    2024年02月13日
    浏览(29)
  • spring注解驱动开发(二)

    17、Bean的生命周期 bean的生命周期:bean的创建—初始化—销毁的过程 容器负责管理bean的生命周期 我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法 构造(对象创建) 单实例:在容器启动时创建对象 多实例:在每

    2024年02月14日
    浏览(39)
  • spring-注解开发bean

    使用@Component定义bean 在配置文件中通过组建扫描加载bean 3.也可以通过不要配置文件,定义类,使用@Configuration,来代替配置文件 基于注解定义bean 1.@component,大部分的bean都可以通过这个来定义 1.1@Controller,控制层 1.2@Service,服务层 1.3@Repository,数据层 2.对于纯注解的开发,还

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包