Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【旧】G003Spring学习笔记-IOC之注解方式实现

【旧】G003Spring学习笔记-IOC之注解方式实现

作者头像
訾博ZiBo
发布于 2025-01-06 07:08:38
发布于 2025-01-06 07:08:38
7200
代码可运行
举报
运行总次数:0
代码可运行

重点知识点总结:

2020年3月18日14:19:13

1、曾经的XML配置方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
  scope="" init-method="" destroy-method="">
    <property name="" value="" / ref=""/>
</bean>

2、注解的分类

用于创建对象的注解:

它们和在xml中编写<bean/>标签实现的功能是一样的;

Component:用于把当前类作为存入spring容器中;

属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;

Controller:一般用在表现层;

Service:一般用在业务层;

Repository:一般用在持久层;

上面三个注解跟Component的作用是一模一样的,它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;

用于注入数据的注解:

它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;

用于改变作用范围的注解:

它们和在xml中使用scope属性实现的功能是一样的;

和生命周期有关的注解:

它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;

一、注解方式说明及入门示例

1、说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 账户的业务层实现类
 * 曾经的xml配置:
 * <bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
 * scope="" init-method="" destroy-method="">
 *   <property name="" value="" / ref=""/>
 * </bean>
 * 用于创建对象的;它们和在xml中编写<bean/>标签实现的功能是一样的;
 * Component:用于把当前类作为存入spring容器中;
 * 属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
 * Controller:一般用在表现层;
 * Service:一般用在业务层;
 * Repository:一般用在持久层;
 * 上面三个注解跟Component的作用是一模一样的,
 * 它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 */

2、入门示例

代码:

接口IAccountService:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.services;

/**
 * 业务层接口
 */
public interface IAccountService {
    /**
     * 模拟保存账户
     */
    void saveAccount();
}

接口实现类AccountServiceImpl:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.services.impl;

import com.zibo.dao.IAccountDao;
import com.zibo.dao.impl.AccountDaoImpl;
import com.zibo.services.IAccountService;
import org.springframework.stereotype.Component;

/**
 * 账户的业务层实现类
 * 曾经的xml配置:
 * <bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
 * scope="" init-method="" destroy-method="">
 *   <property name="" value="" / ref=""/>
 * </bean>
 * 用于创建对象的;它们和在xml中编写<bean/>标签实现的功能是一样的;
 * Component:用于把当前类作为存入spring容器中;
 * 属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
 * Controller:一般用在表现层;
 * Service:一般用在业务层;
 * Repository:一般用在持久层;
 * 上面三个注解跟Component的作用是一模一样的,
 * 它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 */
@Component(value = "accountService")//如果注解中只有一个value,value是乐意省略的
public class AccountServiceImpl implements IAccountService {
    private IAccountDao iAccountDao = new AccountDaoImpl();
    @Override
    public void saveAccount() {
        iAccountDao.saveAccount();
    }
}

Client类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.ui;

import com.zibo.services.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 模拟表现层,调用业务层
 */
public class Client {
    public static void main(String[] args) {
        /*
         * 获取spring的IOC的核心容器,并根据id获取对象
         * ApplicationContext的三个常用实现类:
         * 1、ClassPathXmlApplicationContext(xml方式最常用):仅能加载类路径下的配置文件;
         * 2、FileSystemApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限);
         * 3、AnnotationConfigApplicationContext:用于读取注解创建容器;
         */
        //1、获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2、根据id获取bean对象
        IAccountService service = ac.getBean("accountService",IAccountService.class);
        System.out.println(service);
    }
}

bean.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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">
        <!--告诉spring要创建容器时要扫描的包,但是配置所需要的标签不在<beans/>标签中,
        而是一个名称为context的名称空间和约束中-->
    <context:component-scan base-package="com.zibo"/>
</beans>

pom.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring04</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>

</project>

文件位置图:

运行结果:

二、深入注解方式

1、自动按照类型注入

说明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * Autowired:
 *  作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
 *      补充:
 *          如果没有则注入失败;
 *          如果有多个则在按照类型匹配之后再按照key匹配,匹配到与变量名相同的bean则成功;
 *  出现位置:成员变量上、方法上;
 *  细节:在使用注解时,set方法就不是必须的了;
代码示例:

(部分代码,其他代码见上面)

接口IAccountDao:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.dao;

public interface IAccountDao {
    void saveAccount();
}

接口实现类AccountDaoImpl:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.dao.impl;

import com.zibo.dao.IAccountDao;
import org.springframework.stereotype.Component;

@Component("accountDao")
public class AccountDaoImpl implements IAccountDao {
    @Override
    public void saveAccount() {
        System.out.println("保存了账户111");
    }
}

接口实现类AccountDaoImpl2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.dao.impl;

import com.zibo.dao.IAccountDao;
import org.springframework.stereotype.Component;

@Component("accountDao2")
public class AccountDaoImpl2 implements IAccountDao {
    @Override
    public void saveAccount() {
        System.out.println("保存了账户222");
    }
}

接口实现类AccountServiceImpl:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.services.impl;

import com.zibo.dao.IAccountDao;
import com.zibo.dao.impl.AccountDaoImpl;
import com.zibo.services.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * 账户的业务层实现类
 * 曾经的xml配置:
 * <bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
 * scope="" init-method="" destroy-method="">
 *   <property name="" value="" / ref=""/>
 * </bean>
 * 用于创建对象的;它们和在xml中编写<bean/>标签实现的功能是一样的;
 * Component:用于把当前类作为存入spring容器中;
 *      属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
 * Controller:一般用在表现层;
 * Service:一般用在业务层;
 * Repository:一般用在持久层;
 * 上面三个注解跟Component的作用是一模一样的,
 * 它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * Autowired:
 *  作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
 *      补充:
 *          如果没有则注入失败;
 *          如果有多个则在按照类型匹配之后再按照key匹配,匹配到与变量名相同的bean则成功;
 *  出现位置:成员变量上、方法上;
 *  细节:在使用注解时,set方法就不是必须的了;
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 */
@Component("accountService")//如果注解中只有一个value,value是乐意省略的
public class AccountServiceImpl implements IAccountService {
    @Autowired//不推荐的方法
    //变量名如果是accountDao则匹配到AccountDaoImpl,如果是accountDao2则匹配到AccountDaoImpl2
    private IAccountDao accountDao2;

    @Override
    public void saveAccount() {
        accountDao2.saveAccount();
    }
}

Client类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.ui;

import com.zibo.services.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 模拟表现层,调用业务层
 */
public class Client {
    public static void main(String[] args) {
        /*
         * 获取spring的IOC的核心容器,并根据id获取对象
         * ApplicationContext的三个常用实现类:
         * 1、ClassPathXmlApplicationContext(xml方式最常用):仅能加载类路径下的配置文件;
         * 2、FileSystemApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限);
         * 3、AnnotationConfigApplicationContext:用于读取注解创建容器;
         */
        //1、获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2、根据id获取bean对象
        IAccountService service = ac.getBean("accountService",IAccountService.class);
        service.saveAccount();
    }
}

文件位置图:

运行结果:

2、Qualifier

说明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * Qualifier:
 *  细节:在使用注解时,set方法就不是必须的了;
 *  作用:当自动类型注入出现多个匹配对象时,且变量名匹配不到相同的bean时,使用此方式;
 *  说明:它在给类成员注入时不能单独使用,在给方法注入时可单独使用;
 *  属性:value用于指定注入bean的id;
使用示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Autowired//不推荐的方法
    @Qualifier("accountDao")//指定使用accountDao,则变量名是accountDao2也必须使用accountDao
    //变量名如果是accountDao则匹配到AccountDaoImpl,如果是accountDao2则匹配到AccountDaoImpl2
    private IAccountDao accountDao2;
备注:

@Qualifier要用在@Autowired下面;

3、Resource

说明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * Resource:
 *  作用:直接按照bean的id注入,可以独立使用;
 *  属性:name用于指定bean的id;
使用示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Resource(name = "accountDao2")
注意:

不需要使用@Autowired;

在maven配置文件pom.xml中加入依赖:(???)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.1</version>
        </dependency>
总结:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * 总结:以上三个注解只能注入其他bean类型的数据,基本类型和String类型不能通过上述方法实现;
 * 另外,集合类型的注入只能通过xml实现;

4、Value

说明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * Value:
 *  作用:用于注入基本类型和String类型;
 *  属性:value指定数据的值,它可以使用spring中的SpEL表达式(也就是Spring的EL表达式)
 *  SpEL的写法:${表达式}

5、作用范围和生命周期的注解实现

作用范围:

说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * Scope:
 *  作用:指定Bean的作用范围;
 *  属性:value指定取值的范围,常用取值:singleton(单例,默认) prototype(多例)
 *  出现位置:类上;

代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Scope("prototype")//多例测试
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        IAccountService service = ac.getBean("accountService",IAccountService.class);
        IAccountService service2 = ac.getBean("accountService",IAccountService.class);
        System.out.println(service==service2);//false
生命周期:

说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 * PreDestroy:
 *  作用:用于指定销毁方法;
 * PostConstruct:
 *  作用:用于指定初始化方法;

代码示例:

实现类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.services.impl;

import com.zibo.dao.IAccountDao;
import com.zibo.dao.impl.AccountDaoImpl;
import com.zibo.services.IAccountService;
import jdk.jfr.Frequency;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

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

/**
 * 账户的业务层实现类
 * 曾经的xml配置:
 * <bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
 * scope="" init-method="" destroy-method="">
 *   <property name="" value="" / ref=""/>
 * </bean>
 * 用于创建对象的;它们和在xml中编写<bean/>标签实现的功能是一样的;
 * Component:用于把当前类作为存入spring容器中;
 *      属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
 * Controller:一般用在表现层;
 * Service:一般用在业务层;
 * Repository:一般用在持久层;
 * 上面三个注解跟Component的作用是一模一样的,
 * 它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * Autowired:
 *  作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
 *      补充:
 *          如果没有则注入失败;
 *          如果有多个则在按照类型匹配之后再按照key匹配,匹配到与变量名相同的bean则成功;
 *  出现位置:成员变量上、方法上;
 * Qualifier:
 *  细节:在使用注解时,set方法就不是必须的了;
 *  作用:当自动类型注入出现多个匹配对象时,且变量名匹配不到相同的bean时,使用此方式;
 *  说明:它在给类成员注入时不能单独使用,在给方法注入时可单独使用;
 *  属性:value用于指定注入bean的id;
 * Resource:
 *  作用:直接按照bean的id注入,可以独立使用;
 *  属性:name用于指定bean的id;
 * 总结:以上三个注解只能注入其他bean类型的数据,基本类型和String类型不能通过上述方法实现;
 * 另外,集合类型的注入只能通过xml实现;
 * Value:
 *  作用:用于注入基本类型和String类型;
 *  属性:value指定数据的值,它可以使用spring中的SpEL表达式(也就是Spring的EL表达式)
 *  SpEL的写法:${表达式}
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * Scope:
 *  作用:指定Bean的作用范围;
 *  属性:value指定取值的范围,常用取值:singleton(单例,默认) prototype(多例)
 *  出现位置:类上;
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 * FreDestroy:
 *  作用:用于指定销毁方法;
 * PostConstruct:
 *  作用:用于指定初始化方法;
 */
@Component("accountService")//如果注解中只有一个value,value是乐意省略的
//@Scope("prototype")//多例测试
public class AccountServiceImpl implements IAccountService {
//    @Autowired//不推荐的方法
//    @Qualifier("accountDao")//指定使用accountDao,则变量名是accountDao2也必须使用accountDao
    @Resource(name = "accountDao2")
    //变量名如果是accountDao则匹配到AccountDaoImpl,如果是accountDao2则匹配到AccountDaoImpl2
    private IAccountDao accountDao2;
    @PostConstruct
    private void init(){
        System.out.println("初始化。。。");
    }
    @PreDestroy
    private void destroy(){
        System.out.println("销毁。。。");
    }
    @Override
    public void saveAccount() {
        accountDao2.saveAccount();
    }
}

测试类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.ui;

import com.zibo.services.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 模拟表现层,调用业务层
 */
public class Client {
    public static void main(String[] args) {
        /*
         * 获取spring的IOC的核心容器,并根据id获取对象
         * ApplicationContext的三个常用实现类:
         * 1、ClassPathXmlApplicationContext(xml方式最常用):仅能加载类路径下的配置文件;
         * 2、FileSystemApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限);
         * 3、AnnotationConfigApplicationContext:用于读取注解创建容器;
         */
        //1、获取核心容器对象
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2、根据id获取bean对象
        IAccountService service = ac.getBean("accountService",IAccountService.class);
        service.saveAccount();
        ac.close();
    }
}

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【旧】G002Spring学习笔记-IOC之XML方式实现
它在构建容器时,创建对象采用的策略是立即加载的方式,也就是说,一读完配置文件就马上创建对象;
訾博ZiBo
2025/01/06
780
【旧】G002Spring学习笔记-IOC之XML方式实现
【旧】G004Spring学习笔记-IOC案例
訾博ZiBo
2025/01/06
740
【旧】G006Spring学习笔记-IOC案例完善
訾博ZiBo
2025/01/06
510
【旧】G006Spring学习笔记-IOC案例完善
Spring 常用注解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
多凡
2019/11/01
4200
Spring学习笔记(一)——Spring介绍及工厂模式解耦
Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多 著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架.。
不愿意做鱼的小鲸鱼
2022/09/24
3500
Spring学习笔记(一)——Spring介绍及工厂模式解耦
快速学习-使用 spring 的 IOC 解决程序耦合
本章我们使用的案例是,账户的业务层和持久层的依赖关系解决。在开始 spring 的配置之前,我们要先准备一下环境。由于我们是使用 spring 解决依赖关系,并不是真正的要做增删改查操作,所以此时我们没必要写实体类。并且我们在此处使用的是 java 工程,不是 java web 工程。
cwl_java
2020/04/01
3790
手把手教你使用 Spring IOC 容器完成注入操作(xml注入 + 注解注入)
这三层架构各自分工,独自完成相对应的功能,但是这样的程序写出来会导致程序之间耦合性过高
Gorit
2021/12/08
8950
手把手教你使用 Spring IOC 容器完成注入操作(xml注入 + 注解注入)
Spring的两大核心IOC和AOP
IOC全称Inverse Of Control,中文名控制反转,是spring框架中一种降低程序耦合度(降低程序依赖关系)的设计思想。它的主要目的就是将对象的创建控制权完全交给spring提供的容器处理,由容器统一创建,调用方只需关注对象实现的功能,而无需关注对象是如何创建的。
兜兜转转
2023/03/08
8960
Spring的两大核心IOC和AOP
使用 spring 的 IoC 实现账户的 CRUD
大致步骤: 1.创建数据库 2.账户实体类 3.编写持久层代码 4.账户的持久层实现类 5.编写业务层代码 6.业务层实现类 7.配置文件 基本结构 1.创建数据库 create table account( id int primary key auto_increment, name varchar(40), money float )character set utf8 collate utf8_general_ci; insert into account(name,money) value
别团等shy哥发育
2023/02/27
2160
使用 spring 的 IoC 实现账户的 CRUD
【旧】G001Spring学习笔记-Spring框架概述和程序间耦合
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
訾博ZiBo
2025/01/06
560
【旧】G001Spring学习笔记-Spring框架概述和程序间耦合
Spring的常用注解
使用注解需要在xml文件中配置扫描注解配置的包 <context:component-scan base-package=“com.rpf”></context:component-scan> @Component 作用:用于把当前类对象存入spring容器中 属性:value用于指定bean的id。当我们不写时 他的默认值是当前类名首字母改小写 只有一个属性时value可以不写@Component(“accountService”) 它们的作用和xml文件中编写bean标签实现的功能是一样的 Controller:一般用在表现层 Service:一般用在业务层 Repository:一般用于持久层 可以互相替换不建议 以上三个注解作用和属性与Component时一模一样的 它们三个是spring框架为我们提供明确的三层使用的注解 使我们的三层对象更加清晰 例
暴躁的程序猿
2022/03/23
1840
Spring的常用注解
Spring学习笔记(二)——依赖注入
依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。 我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。 ioc 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。 那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
不愿意做鱼的小鲸鱼
2022/09/24
3140
快速学习-基于注解的 IOC 配置
学习基于注解的 IoC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。
cwl_java
2020/04/02
3930
快速学习-使用 spring 的 IoC 的实现账户的CRUD
使用 spring 的 IoC 实现对象的管理 使用 DBAssit 作为持久层解决方案 使用 c3p0 数据源
cwl_java
2020/04/02
4120
【旧】G005Spring学习笔记-Spring完全注解实现及优化
因为junit继承了一个main方法,这个main方法会判断当前测试类中有@Test注解的方法,并使其执行;
訾博ZiBo
2025/01/06
950
【旧】G005Spring学习笔记-Spring完全注解实现及优化
Spring学习笔记(三)——Spring注解开发&spring与Junit整合测试
1、应用程序的入口 main方法 2、junit单元测试中,没有main方法也能执行 junit集成了一个main方法 该方法就会判断当前测试类中哪些方法有 @Test注解 junit就让有Test注解的方法执行 3、junit不会管我们是否采用spring框架 在执行测试方法时,junit根本不知道我们是不是使用了spring框架 所以也就不会为我们读取配置文件/配置类创建spring核心容器 4、由以上三点可知 当测试方法执行时,没有Ioc容器,就算写了Autowired注解,也无法实现注入
不愿意做鱼的小鲸鱼
2022/09/24
3340
Spring学习笔记(三)——Spring注解开发&spring与Junit整合测试
从零开始重新认识 Spring Framework
如果你想快速入门 Spring 框架,或者想快速复习 Spring 的基本操作,那么这篇文章再适合你不过了。
wsuo
2020/07/30
4960
从零开始重新认识 Spring Framework
Spring学习笔记(五)——JdbcTemplate和spring中声明式事务
它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多的操作模板类。 1. 操作关系型数据的: JdbcTemplate HibernateTemplate 2. 操作 nosql 数据库的: RedisTemplate 3. 操作消息队列的: JmsTemplate spring中的JdbcTemplate在 spring-jdbc-5.0.2.RELEASE.jar 中,我们在导包的时候,除了要导入这个 jar 包外,还需要导入一个 spring-tx-5.0.2.RELEASE.jar(它是和事务相关的)。
不愿意做鱼的小鲸鱼
2022/09/24
1.2K0
Spring学习笔记(五)——JdbcTemplate和spring中声明式事务
Spring 通过单表 CURD 认识配置IOC的两兄弟(XML&注解)
前面一篇文章花大量内容,重点学习了 Spring入门 的一些思想,以及简单的学习了 IOC基础 以及基于基于 XML 的配置方式,大家应该清楚,XML与注解常常是形影不离的,他们就像一对双胞胎,但兄弟两个的想法都是一致的,那就是帮助开发者实现想要的功能,我们所说的IOC 技术,无疑是为了降低程序间的耦合,那么,今天就来聊一聊,基于注解的IOC配置,当然为了大家有对比学习,两种配置同时讲解,同时我把例举得尽量完整一些,就来完成一个对单表进行 CURD 的案例
BWH_Steven
2020/03/04
6290
SSM 整合详细步骤
持久层实现类代码: 此时不要做任何操作,就输出一句话。目的是测试 spring 框架搭建的结果。
全栈程序员站长
2022/08/27
5490
SSM 整合详细步骤
推荐阅读
相关推荐
【旧】G002Spring学习笔记-IOC之XML方式实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验