当前位置: 首页 > article >正文

【SSM】Spring6(七.Spring IoC注解式开发)

文章目录

  • 1.声明Bean的注解
  • 2.Spring注解的使用
    • 2.1 添加aop的依赖
    • 2.2 在配置文件中添加context命名空间
    • 2.3 在配置文件中指定要扫描的包
    • 2.4 在Bean上使用注解
    • 2.5 细节
  • 3.选择实例化Bean
    • 3.1 方案一
    • 3.2 方案二
  • 4.负责注入的注解
    • 4.1 @value
    • 4.2 @Autowired @Qualifier
    • 4.3 @Resource
  • 5.全注解式开发

1.声明Bean的注解

常见的声明Bean的注解注意包括以下4个:
● @Component
● @Controller
● @Service
● @Repository

@Controller、@Service、@Repository这三个注解都是@Component注解的别名。
也就是说:这四个注解的功能都一样。用哪个都可以。
只是为了增强程序的可读性,建议:
● 控制器类上使用:Controller
● service类上使用:Service
● dao类上使用:Repository
他们都是只有一个value属性。value属性用来指定bean的id,也就是bean的名字。

2.Spring注解的使用

四个步骤

2.1 添加aop的依赖

当加入spring-context依赖之后,会关联加入aop的依赖。
在这里插入图片描述

2.2 在配置文件中添加context命名空间

在这里插入图片描述
spring配置文件

<?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/beans/spring-context.xsd">
</beans>

2.3 在配置文件中指定要扫描的包

<?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:component-scan base-package="com.sdnu.spring6.bean"/>
</beans>

2.4 在Bean上使用注解

package com.sdnu.spring6.bean;

import org.springframework.stereotype.Component;

@Component(value = "userBean")
public class User {
}

2.5 细节

(1)属性名value可以省略
(2)如果把value属性彻底去掉,spring会被Bean自动取名,默认名字的规律是:Bean类名首字母小写即可。
(3)多个包
方法一:在配置文件中指定多个包,用逗号隔开。

    <context:component-scan base-package="com.sdnu.spring6.bean, com.sdnu.spring6.dao"/>

方法二:指定多个包的共同的父包。

3.选择实例化Bean

假设在某个包下有很多Bean,有的Bean上标注了Component,有的标注了Controller,有的标注了Service,有的标注了Repository,现在由于某种特殊业务的需要,只允许其中所有的Controller参与Bean管理,其他的都不实例化。这应该怎么办呢?

package com.sdnu.spring6.bean2;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

@Component
public class A {
    public A() {
        System.out.println("A的构造方法执行");
    }
}

@Repository
class B{
    public B() {
        System.out.println("B的构造方法执行");
    }
}

@Controller
class C{
    public C() {
        System.out.println("C的构造方法执行");
    }
}

@Service
class D{
    public D() {
        System.out.println("D的构造方法执行");
    }
}

3.1 方案一

use-default-filters=“false”:不再spring默认实例化规则,即使有Component、Controller、Service、Repository这些注解标注,也不再实例化
spring配置文件

<?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">

    <!--表示com.sdnu.spring6.bean2包下所有带有声明Bean的注解全部失效-->
    <context:component-scan base-package="com.sdnu.spring6.bean2" use-default-filters="false">
        <!--只有@Controller和@Service被包含进来,生效-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>
</beans>

测试

@Test
    public void ChooseTest(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-choose.xml");
    }

在这里插入图片描述

3.2 方案二

use-default-filters=“true” 表示:使用spring默认的规则,只要有Component、Controller、Service、Repository中的任意一个注解标注,则进行实例化。
spring配置文件

<?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">

    <!--表示com.sdnu.spring6.bean2包下所有带有声明Bean的注解全部生效-->
    <context:component-scan base-package="com.sdnu.spring6.bean2" use-default-filters="true">
        <!--排出哪些注解标注的Bean不参与实例化,即@Controller @Service失效-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>
</beans>

测试

@Test
    public void ChooseTest(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-choose.xml");
    }

在这里插入图片描述

4.负责注入的注解

● @Value
● @Autowired
● @Qualifier
● @Resource

4.1 @value

当属性的类型是简单类型时,可以使用@Value注解进行注入。
@Value注解可以出现在属性上、setter方法上、以及构造方法的形参上。

package com.sdnu.spring6.bean3;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;

@Component
public class MyDataSource implements DataSource {
    @Value(value = "com.mysql.jdbc.driver")
    private String driver;
    @Value(value = "jdbc:mysql://localhost:3306")
    private String url;
    @Value(value = "root")
    private String username;
    @Value(value = "123456")
    private String password;

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "MyDataSource{" +
                "driver='" + driver + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    @Override
    public Connection getConnection() throws SQLException {
        return null;
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return null;
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }
}

配置文件

<?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:component-scan base-package="com.sdnu.spring6.bean3"/>
</beans>

测试

    @Test
    public void testDiAnnotation(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-di-annotation.xml");
        MyDataSource myDataSource = applicationContext.getBean("myDataSource", MyDataSource.class);
        System.out.println(myDataSource);
    }

4.2 @Autowired @Qualifier

(1)
@Autowired注解可以用来注入非简单类型。被翻译为:自动连线的,或者自动装配。
单独使用@Autowired注解,默认根据类型装配。【默认是byType】
(2)
@Autowired注解有一个required属性,默认值是true,表示在注入的时候要求被注入的Bean必须是存在的,如果不存在则报错。如果required属性设置为false,表示注入的Bean存在或者不存在都没关系,存在的话就注入,不存在的话,也不报错。
(3)
● @Autowired注解可以出现在:属性上、构造方法上、构造方法的参数上、setter方法上。
● 当带参数的构造方法只有一个,@Autowired注解可以省略。
● @Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。

4.3 @Resource

@Resource注解也可以完成非简单类型注入。

@Resource与@Autowired的区别:
(1)
● @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-250标准中制定的注解类型。JSR是Java规范提案。)
● @Autowired注解是Spring框架自己的。
(2)
● @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
● @Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用。
(3)
● @Resource注解用在属性上、setter方法上。
● @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。

引入额外依赖:
spring 6

<dependency>
  <groupId>jakarta.annotation</groupId>
  <artifactId>jakarta.annotation-api</artifactId>
  <version>2.1.1</version>
</dependency>

spring5-

<dependency>
  <groupId>javax.annotation</groupId>
  <artifactId>javax.annotation-api</artifactId>
  <version>1.3.2</version>
</dependency>

5.全注解式开发

全注解式开发就是不再使用spring配置文件了。而是写一个配置类来代替配置文件。

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

/**
 * 编写一个类,代替spring配置文件
 */
@Configuration
@ComponentScan({"cn.sdnu.dao", "cn.sdnu.service"})
public class Spring6Config {
}

http://www.kler.cn/a/6824.html

相关文章:

  • 【Pythonr入门第二讲】你好,世界
  • 【鸿蒙生态崛起,开发者有哪些机遇与挑战?】HarmonyOS NEXT 引领数字化未来
  • 【c++丨STL】list的使用
  • 任务管理功能拆解——如何高效管理项目任务?
  • 【vmware+ubuntu16.04】vm虚拟机及镜像安装-tools安装包弹不出来问题
  • golang开源框架:go开源验证框架validator
  • 第四届国际工业信息安全应急大会完美落幕,赛宁网安载誉满满!
  • 安装VMware虚拟机操作到Linux联网时显示线缆被拔出解决方法(以太网不可用)
  • linux命令整理版
  • FreeRTOS任务状态迁移图
  • git放弃修改,强制覆盖本地代码
  • [C++]C++基础知识概述
  • 子网掩码和CIDR
  • vue实现油色谱大卫三角
  • 经济法基础:第三章 支付结算法律制度
  • 服务器: 这个 token 是我的吗? 我不信
  • P5725 【深基4.习8】求三角形
  • 【Python】PyCharm 快捷操作说明(Tip of the Day):Ctrl 键
  • Android应用程序崩溃:影响、原因和解决方案
  • VR全景展示,全景VR如何制作,如何制作高质量VR全景图!
  • 晶振03——晶振烧坏的原因
  • SQL VQ14 统计每天刷题数超过5的user_id以及刷题数
  • mit6.824 lab2c-数据持久化
  • day20—选择题
  • 【设计模式】创建型-抽象工厂模式
  • Vue3中父子表单组件数据同步问题