Spring 中使用 xml 配置开发和使用注解开发案例

1、Spring 中使用 xml 配置开发案例

接口

public interface UserDao {

    void add(User user);
}
========================================================================================
public interface UserService { void add(User user);
}

接口的实现类

public class UserDaoImpl implements UserDao {

    @Override
public void add(User user) {
System.out.println("Dao 添加用户信息======>" + user);
}
}
=========================================================================================
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) {
this.userDao = userDao;
} @Override
public void add(User user) {
System.out.println("Service 添加用户信息======>" + user);
userDao.add(user);
}
}
========================================================================================= 模拟UserAction调用方法
public class UserAction { private UserService userService; public void setUserService(UserService userService) {
this.userService = userService;
} public void save(User user) {
System.out.println("UserAction 方法调用");
userService.add(user);
}
}

配置bean.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: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"> <!-- 1.配置dao-->
<bean id="userDao" class="com.example.demo.code.impl.UserDaoImpl"></bean> <!-- 2.配置service -->
<bean id="userService" class="com.example.demo.code.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean> <!--3.配置action-->
<bean id="userAction" class="com.example.demo.code.UserAction">
<property name="userService" ref="userService"></property>
</bean>
</beans>

测试函数

public class ServiceTest {

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        UserAction userAction = context.getBean(UserAction.class);

        User user = new User();
user.setUsername("玉皇大帝");
user.setPassword("888");
user.setAge(9999); userAction.save(user);
}
}

结果如下所示:

UserAction 方法调用。

Service 添加用户信息======>User{username='玉皇大帝', password='888', age=9999}。

Dao 添加用户信息======>User{username='玉皇大帝', password='888', age=9999}

可以看出是一层一层调用到 :action -> service -> dao

2、Spring 中使用注解开发案例

接口不变。修改接口的实现类

@Repository
public class UserDaoImpl implements UserDao { @Override
public void add(User user) {
System.out.println("Dao 添加用户信息======>" + user);
}
}
=========================================================================================
@Service
public class UserServiceImpl implements UserService { @Autowired
private UserDao userDao; @Override
public void add(User user) {
System.out.println("Service 添加用户信息======>" + user);
userDao.add(user);
}
}
=========================================================================================
@Controller
public class UserAction { @Autowired
private UserService userService; public void save(User user) {
System.out.println("UserAction 方法调用");
userService.add(user);
}
}

执行上面的测试函数即可在控制台打印和第一个案例一样的信息。

3、@Qualifier("id") & @Resource(name="id") 注解含义

如果在 UserServiceImpl 类上将注解修改为 @Service("myUserService")。如果需要注入指定 id 的类需要同时加上注解:@Autowired、@Qualifier("myUserService")。

@Autowired 是按照类型注入。

如果是接口,从容器中查找接口的实现类注入;如果是类,就在容器中查找类进行注入。

@Qualifier("id名称")是按照指定id注入。

@Resource(name="id") = @Autowired+@Qualifier("id") 。

4、@Scope("prototype") 和 @Scope("singleton")

@Scope("singleton")

修改测试代码,再次执行

public class ServiceTest {

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        UserAction userAction = context.getBean(UserAction.class);

        UserAction userAction2 = context.getBean(UserAction.class);

        System.out.println(userAction);
System.out.println(userAction2); }
}

控制台信息如下:

com.example.demo.code.UserAction@7098b907

com.example.demo.code.UserAction@7098b907

说明 Spring 注入默认是单例。

@Scope("prototype")

在 UserAction 加上注解 @Scope("prototype") ,再次执行测试函数。

控制台信息如下:

com.example.demo.code.UserAction@7098b907

com.example.demo.code.UserAction@503f91c3

说明 Spring 注入可以配置多例。

重点:Spring 中默认注入是单例的。

Spring 讲解(五)的更多相关文章

  1. Spring第五篇

    在Spring第四篇中 我们主要介绍了set get的注入方式 在Spring第五篇中 我们主要介绍使用注解配置Spring 主要分为两个步骤 1 导包的同时引入新得约束 导包如下 1.1 重写注解代 ...

  2. Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解

    BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...

  3. spring讲解

    今日先简单介绍一下Spring bean 的 5 种效果域,然后详细介绍 singleton 和 prototype 这两种最常用的效果域. JavaSpring Bean的五种效果域 效果域的种类 ...

  4. 深入浅出Spring(五) SpringMVC

    上一篇深入浅出Spring(四) Spring实例分析的博文中,咱们已经可以了解Spring框架的运行原理和实现过程,接下来咱们继续讲解Spring的一个延伸产品——Spring MVC 1.Spri ...

  5. Spring第五篇【cglib、手动实现AOP编程】

    前言 到目前为止,已经简单学习了Spring的Core模块.也会怎么与Struts2框架进行整合了-.于是我们就开启了Spring的AOP模块了-在讲解AOP模块之前,首先我们来讲解一下cglib代理 ...

  6. Java框架之Spring(五)

    本文主要介绍Spring中, 1 Spring JDBC 2 使用注解方式管理事务的传播行为 3 采用XML 方式配置事务 4 SH 整合 5 SSH 整合 一.Spring JDBC 1) 导包 , ...

  7. Spring(五):Spring&Struts2&Hibernate整合后,实现查询Employee信息

    背景: 基于之前两篇文章<Spring(三):Spring整合Hibernate>.<Spring(四):Spring整合Hibernate,之后整合Struts2>,了解了如 ...

  8. spring学习(五) ———— 整合web项目(SSM)

    一.SSM框架整合 1.1.整合思路 从底层整合起,也就是先整合mybatis与spring,然后在编写springmvc. 1.2.开发需求 查询商品列表(从数据库中查询) 1.3.创建web工程 ...

  9. Spring系列(五) 容器初始化过程源码

    IoC/DI 的概念 容器是Spring的核心之一(另一个核心是AOP). 有了容器, IOC才可能实现. 什么使IoC? IoC就是将类自身管理的与其由依赖关系的对象的创建/关联和管理交予容器实现, ...

随机推荐

  1. Python中的"Special Method"

    The first thing to know about special methods is that they are meant to be called by the Python inte ...

  2. boost function bind ref

    boost::function to encapsulate function pointers. 1. function #include <boost/function.hpp> #i ...

  3. webpack.config.js配置入口出口文件

    目录结构: 新建webpack.config.js配置文件 const path = require('path') //导出 path是node内置的包 通过npm init初始化得到package ...

  4. Apache Flink 进阶(八):详解 Metrics 原理与实战

    本文由 Apache Flink Contributor 刘彪分享,本文对两大问题进行了详细的介绍,即什么是 Metrics.如何使用 Metrics,并对 Metrics 监控实战进行解释说明. 什 ...

  5. Leetcode_897. Increasing Order Search Tree

    题目:https://leetcode.com/problems/increasing-order-search-tree/ 题意: 将一棵二叉搜索树,重排为一棵递增的二叉排序树. 解法1: rson ...

  6. 【Flutter学习】基本组件之Webview组件

    1.添加依赖 dependencies: flutter_webview_plugin: ^+ 2.导入库 import 'import 'package:flutter_webview_plugin ...

  7. 【Linux】关闭selinux

    vi /etc/selinux/config 将SELINUX=enforcing改为SELINUX=disabled 设置后需要重启才能生效

  8. [CSP-S模拟测试]:Walk(BFS+建边)

    题目描述 在比特镇一共有$n$个街区,编号依次为$1$到$n$,它们之间通过若干条单向道路连接. 比特镇的交通系统极具特色,除了$m$条单向道路之外,每个街区还有一个编码${val}_i$,不同街区可 ...

  9. js中Array方法重写(二):myForEach;myEvery;mySome;myFilter;myReduce

    一.myForEach //myForeach 数组每个元素都执行一次回调函数 Array.prototype.myForEach = function(callback){ for(var i = ...

  10. jsp的课设1

    记这个为了巩固整个网站的开发流程,java开发太昂贵基本上很少有公司用,不知道学校怎么想的用这个.基本流程适用于任何后台的开发. JDK的安装不提了,Tomcat和Mysql都是用的最新版的,由于是w ...