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. IncepText算法笔记

    源头:场景文本经常受到aspect ratio, scal, and orientation的影响 为了解决这个问题,提出了inceptext,主要贡献在于添加了inception-text modu ...

  2. 设置Oracle PL/SQL时间显示格式NLS_TIMESTAMP_FORMAT

    Oracle中TIMESTAMP时间的显示格式   Oracle数据库的时间字段我们通常是使用timestamp 格式,在未做设置前, 查询出来的数据类似于“27-1月 -08 12.04.35.87 ...

  3. 用Redis进行实时数据排名

    1先生成一个Redis对象 2实例化一个对象.zscore有序集合中进行排序 3 Redis Zscore命令返回有序集合中,成员的分数值.如果成员元素不是有序集合 key的成员,则key不存在,返回 ...

  4. shell脚本学习 (10) 从结构化文本提取数据

    1提取/ 后的数据 sed -e 's=/.*==' do.txt 2 sed -e 's=/.*=='\ -e 's=^\([^:]*\):\(.*\) \([^ ]*\)=\1:\3, \2=' ...

  5. ldd3 第12章 PCI驱动程序

    PCI接口 PCI寻址 引导阶段 配置寄存器和初始化 MODULE_DEVICE_TABLE 注册PCI驱动程序 佬式PCI探测 激活PCI设备 访问配置空间 访问I/O和内存空间 PCI中断 硬件抽 ...

  6. iOS设计模式之装饰者模式

    一,什么是装饰模式 模式定义 装饰者包含被装饰者的所有接口和引用,方法实现完全是引用调用自己的方法,在装饰者子类添加新功能. 注释: Category不要重写被装饰对象的方法,否则改变了被装饰对象的行 ...

  7. TP中如何用IF

    将TP中这个容易忘的知识点记下来以便日后翻阅 $memberField = "ID, NAME, MOBILE, MEMBER_STATUS as status, IF (MEMBER_ST ...

  8. PHP远程DoS漏洞深入分析及防护方案

    PHP远程DoS漏洞 4月3日,有人在PHP官网提交PHP 远程DoS漏洞(PHP Multipart/form-data remote dos Vulnerability),代号69364.由于该漏 ...

  9. 2018-2019-2 20175213实验四 《Android开发基础》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:吕正宏 学号:20175213 指导教师:娄嘉鹏 实验日期:2019年5月14日 实验时间:13:45 - 21:00 实验序号:实验 ...

  10. leetcode-解题记录 557. 反转字符串中的单词 III

    题目: 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输出 ...