全部章节   >>>>


本章目录

1.1 Spring框架基础

1.1.1 Spring特点及体系结构

1.1.1 Spring的体系结构

1.1.2  使用Eclipse搭建Spring开发环境

1.1.3  简单的Spring依赖注入

1.1.4  set注入

1.1.5  ref属性的作用及使用

1.1.6 实践练习

1.2 通过工厂方式创建Bean对象

1.2.1  静态工厂创建Bean对象

1.2.3 实践练习

1.3 Spring属性注入

1.3.1 构造方法注入属性

1.3.2 p命名空间注入属性

1.3.3 表达式spel方式注入属性

1.3.4 实践练习

1.4 BeanFactory与ApplicationContext的区别

1.4.1 BeanFactory接口

1.4.2 ApplicationContext接口

1.4.3 实践练习

总结


1.1 Spring框架基础

1.1.1 Spring特点及体系结构

Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。

Spring的核心是依赖注入、控制反转和面向切面编程。

Spring认为Java EE的开发应该更容易、更简单。

Spring的优势有以下几点:

  • 方便解耦,简化开发。
  • AOP编程的支持。
  • 声明式事务的支持。
  • 方便程序的测试。
  • 方便集成各种优秀的框架。
  • 降低Java EE API的使用难度。

1.1.1 Spring的体系结构

Spring的整个框架按其所属功能可以划分为七个主要组件。

1.1.2  使用Eclipse搭建Spring开发环境

打开Eclipse工具,创建Dynamic Web Project项目

在工程中,引入Spring的核心jar包

创建Spring核心配置文件applicationContext.xml

打开applicationContext.xml文件,引入beans约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!-- 此空白处输入内容 -->
</beans>

1.1.3  简单的Spring依赖注入

在没有Spring框架之前,Java应用程序都是由多个类组成,它们之间相互协作来完成特定的业务逻辑。每个对象之间相互联系,导致了高度耦合的代码,不便于维护。而Spring框架的依赖注入使代码解耦合,便于维护。

在applicationContext.xml文件中使用bean元素注入对象:

在com.mhys.bean包下,创建一个Student.java类

public class Student {
private String stuId;
private String name;
// set()方法和get()方法省略
}

在applicationContext.xml文件中,注册Student类 在com.mhys.test包下,编写测试类,在控制台输出结果。

// 获取上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取配置中Student实例
Student student = (Student) context.getBean("student");
// 输出结果
System.out.println(student);

运行程序,在控制台中,查看输出结果

<!-- id:代表实例化名 class:选择要实例化的类 -->
<bean id="student" class="com.mhys.bean.Student"></bean>

1.1.4  set注入

Spring框架提供了4种常用的注入方式,set注入、构造方法注入、p命名空间注入以及表达式spel方式注入,本节只讲解set注入的实现方法,其他注入方式后续会陆续讲到。

在applicationContext.xml配置文件中,不仅能完成对象的初始化。还可以动态配置属性信息,这也是Spring功能强大之所在。

该案例讲解的是通过set注入方式,使用property元素对类属性实现静态注入。

示例:在applicationContext.xml文件中使用bean元素注入对象

在Student类中注入name属性的属性值。

<bean id="student" class="com.mhys.bean.Student">
<!-- name:属性名 value:属性值 -->
<property name="name" value="Jack"></property>
</bean>

在测试类中调用getName()方法。

System.out.println(student.getName());

在控制台中,查看输出结果。

1.1.5  ref属性的作用及使用

有时在类与类之间存在依赖关系。例如,在一个类中对另一个类的引用。

Employee类引入Car类

public class Car {
private String brand;
private String carNo;
// set()方法和get()方法省略
}
public class Employee {
private String name;
private Car car;
// set()方法和get()方法省略
}

示例:在applicationContext.xml文件中使用bean元素注入对象

在com.mhys.bean包下,创建Phone类,并添加call()方法。

public class Phone {
private String message; public void call(){
System.out.println(message);
}
// set()方法和get()方法省略
}

修改Student类,添加对Phone的依赖。

public class Student {
private String stuId;
private String name;
private Phone phone; // set()方法和get()方法省略
}

在applicationContext.xml配置文件中,注册Phone类到容器,并在Student Bean中使用ref属性引用Phone Bean。

<bean id="phone" class="com.mhys.bean.Phone">
<property name="message" value="Good morning,Jack"></property>
</bean>
<bean id="student" class="com.mhys.bean.Student">
<property name="phone" ref="phone"></property>
</bean>

在TestMain测试类中,调用call()方法

System.out.println(student.getPhone().call());

在控制台中,查看输出结果

1.1.6 实践练习

1.2 通过工厂方式创建Bean对象

在Spring框架中,对Bean的创建方式有三种方式

  • 静态工厂方法创建Bean
  • 实例工厂方法创建Bean
  • 构造方法创建Bean

通过简单的配置来完成Bean对象的实例化,其本质上是通过构造方法创建Bean实例,接下来学习使用静态、动态创建Bean对象的两种方法。

1.2.1  静态工厂创建Bean对象

示例:在applicationContext.xml文件中使用bean元素注入对象

在com.mhys.bean包下,创建User类,添加userName和password属性。

public class User {
private String userName;
private String password;
// set()和get()方法省略
}

在com.mhys.bean包下,创建UserFactory类,声明getInstance()方法。

public class UserFactory {
public static User getInstance(){
System.out.println("静态工厂方法创建对象!");
return new User();
}
}

在applicationContext.xml配置文件中,注册UserFactory类到容器。

<!-- 定义User Bean 由UserFactory工厂的getInstance()方法创建 -->
<bean id="user" class="com.mhys.bean.UserFactory" factory-method="getInstance"></bean>

在com.mhys.test包下,创建测试类 在控制台中,查看输出结果

public class Test {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
}
}

示例:在applicationContext.xml文件中使用bean元素注入对象

在UserFactory类,增加getUser()方法。

public User getUser(){
System.out.println("动态工厂方法创建对象!");
return new User();
}

在applicationContext.xml配置文件中,注入UserFactory类。

	<!-- 配置工厂Bean -->
<bean id="userFactory" class="com.mhys.bean.UserFactory"></bean>
<!-- 声明由实例工厂userFactory的getUser()方法,创建User Bean对象-->
<bean id="user1" factory-bean="userFactory" factory-method="getUser" ></bean>

编写测试类。 在控制台中,查看输出结果

public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user1 = (User) context.getBean("user1");
System.out.println(user1);
}
}

1.2.3 实践练习

1.3 Spring属性注入

在Spring框架中,属性的注入我们有多种方式,前面我们学过使用set方式注入,接下来我们学习构造方法注入属性、p命名空间注入属性和spel方式注入属性这三种属性注入方式。

1.3.1 构造方法注入属性

示例:使用constructor-arg元素来完成构造方法属性注入

在com.mhys.bean包下创建User类添加username和password属性并添加有参构造方法。

public class User {
private String username;
private String password; @Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
// 有参构造方法
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {
super();
}
// set()方法和get()方法省略
}

在applicationContext.xml配置文件中,注册User类到容器。

<bean id="user" class="com.mhys.bean.User">
<!-- 构造方法注入属性 -->
<constructor-arg name="username" value="刘强"></constructor-arg>
<constructor-arg name="password" value="1q2w3e"></constructor-arg>
</bean>

在com.mhys.test包下,创建测试类 在控制台中,查看输出结果

public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
}
}

1.3.2 p命名空间注入属性

示例:在applicationContext.xml配置文件中,通过p:属性名=属性值方式注入属性

在com.mhys.bean包下,创建Car类,首先,添加brand和carNo两个属性。

public class Car {
private String brand;
private String carNo; @Override
public String toString() {
return "Car [brand=" + brand + ", carNo=" + carNo + "]";
}
// set()方法和get()方法省略
}

在User类中,新增Car类型属性。

public class User {
private String username;
private String password;
private Car car; @Override
public String toString() {
return "User [username=" + username + ", password=" + password+ ", car=" + car + "]";
}
// set()方法和get()方法省略
}

在applicationContext.xml配置文件中,注册User类和Car类到容器。

<!-- p命名空间注入属性值 -->
<bean id="car" class="com.mhys.bean.Car" p:brand="奔驰" p:carNo="D4562"></bean>
<bean id="user" class="com.mhys.bean.User" p:username="李瑞" p:password="asd123" p:car-ref="car">
</bean>

编写测试类。 在控制台中,查看输出结果。

public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
}
}

p命名空间注入属性之前需要引入对应约束,xmlns:p="http://www.springframework.org/schema/p",p命名空间没有对应的Schema文件。

1.3.3 表达式spel方式注入属性

示例:在applicationContext.xml配置文件中,注册User和Car类到容器

在com.mhys.bean包下,创建Car类,首先,添加brand和carNo两个属性。

<bean id="car" class="com.mhys.bean.Car">
<!-- 表达式spel方式注入属性 -->
<property name="brand" value="#{'宝马'}"></property>
<property name="carNo" value="#{'A2496'}"></property>
</bean>
<bean id="user" class="com.mhys.bean.User">
<property name="username" value="#{'杨强'}"></property>
<property name="password" value="#{'zxc456'}"></property>
<property name="car" ref="car"></property>
</bean>

在控制台中,查看输出结果。

1.3.4 实践练习

1.4 BeanFactory与ApplicationContext的区别

BeanFactory和AppliactionContext创建Spring容器的区别主要体现在Bean创建时间的不同

ApplicationContext采用的是创建上下文的方式创建Spring容器

Bean是在创建容器时即被加载。BeanFactory采用的是延时加载,即容器需要Bean的时候才加载实例。

1.4.1 BeanFactory接口

BeanFactory是IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对Bean的创建和访问等工作。

XmlBeanFactory的演示案例:

编写测试类。

public class Test {
public static void main(String[] args) {
Resource resource = new ClassPathResource("applicationContext.xml");
XmlBeanFactory beanFactory = new XmlBeanFactory(resource);
User user = (User) beanFactory.getBean("user");
System.out.println(user);
}
}

在控制台中,查看输出结果

1.4.2 ApplicationContext接口

ApplicationContext即应用上下文,它是建立在BeanFactory基础之上的。

ApplicationContext有四个主要的实现类:

  • ClassPathXmlApplicationContext:默认从类路径(classes目录下)加载配置文件。
  • FileSystemXmlApplicationContext:默认从文件系统中加载配置文件。
  • XmlWebApplicationContext
  • AnnotationConfigWebApplicationContext。

XmlWebApplicationContext与AnnotationConfigWebApplicationContext是专门为Web应用提供的。

示例:通过FileSystemXmlApplicationContext获取上下文容器对象

在com.mhys.pojo包下,创建Book类,首先,添加bookName和pages两个属性。

public class Book {
private String bookName; // 书名
private int pages; // 页数
// set()方法和get()方法省略
}

在applicationContext.xml配置文件中,注入Book类。

<!-- p命名空间注入属性 -->
<bean id="book" class="com.mhys.pojo.Book" p:bookName="西游记" p:pages="360"> </bean>

在com.mhys.test包下,编写测试类。 在控制台中,查看输出结果。

public class Test {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Book book = (Book) context.getBean("book");
System.out.println(book.getBookName() + "总共" + book.getPages() + "页");
}
}

1.4.3 实践练习

总结

  • Spring是一个轻量级的IoC和AOP容器框架,是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。
  • IoC就是控制反转,是指创建对象的控制权的转移
  • BeanFactory和AppliactionContext创建Spring容器的区别主要体现在Bean创建时间的不同,ApplicationContext采用的是创建上下文的方式创建Spring容器,Bean是在创建容器时即被加载。BeanFactory采用的是延时加载,即容器需要Bean的时候才加载实例。

Spring企业级程序设计 • 【第1章 Spring之旅】的更多相关文章

  1. Spring企业级程序设计作业目录(作业笔记)

    Spring企业级程序设计 • [目录] 第1章 Spring之旅  >>> 1.1.6 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打 ...

  2. Spring企业级程序设计 • 【目录】

    章节 内容 实践练习 Spring企业级程序设计目录(作业笔记) 第1章 Spring企业级程序设计 • [第1章 Spring之旅] 第2章 Spring企业级程序设计 • [第2章 Spring ...

  3. Spring企业级程序设计 • 【第7章 Spring框架整合】

    全部章节   >>>> 本章目录 7.1 模型数据解析及控制器返回值 7.1.1 SSM框架环境搭建 7.1.1 ModelAndView多种用法 7.1.2 整合MyBati ...

  4. Spring企业级程序设计 • 【第5章 Spring MVC快速入门】

    全部章节   >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2  S ...

  5. Spring企业级程序设计 • 【第2章 Spring Bean管理进阶】

    全部章节   >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...

  6. Spring入门篇——第7章 Spring对AspectJ的支持

    第7章 Spring对AspectJ的支持 介绍Spring对AspectJ的支持 7-1 AspectJ介绍及Pointcut注解应用 实例 完成了在xml文件的配置 7-2 Advice定义及实例 ...

  7. Spring入门篇——第6章 Spring AOP的API介绍

    第6章 Spring AOP的API介绍 主要介绍Spring AOP中常用的API. 6-1 Spring AOP API的Pointcut.advice概念及应用 映射方法是sa开头的所有方法 如 ...

  8. Spring入门篇——第5章 Spring AOP基本概念

    第5章 Spring AOP基本概念 本章介绍Spring中AOP的基本概念和应用. 5-1 AOP基本概念及特点 5-2 配置切面aspect ref:引用另外一个Bean 5-3 配置切入点Poi ...

  9. Spring入门篇——第4章 Spring Bean装配(下)

    第4章 Spring Bean装配(下) 介绍Bean的注解实现,Autowired注解说明,基于java的容器注解说明,以及Spring对JSR支持的说明 4-1 Spring Bean装配之Bea ...

随机推荐

  1. BigDecimal中要注意的一些事

    一.关于public BigDecimal(double val) BigDecimal中三个主要的构造函数 1 public BigDecimal(double val) 将double表示形式转换 ...

  2. 【C/C++】习题3-4 周期串/算法竞赛入门经典/数组和字符串

    [题目] 如果某个字符串可以由长度为k的字符串重复多次得到,则称该串以k为周期. 输入一个长度不超过80的字符串,输出最小周期. [思路] 暴力求解.依次考察周期1~长度n. 筛选:周期一定是长度n的 ...

  3. Nginx区分搜索引擎

    目录 一.简介 二.配置 一.简介 场景: 当从百度点进来显示中文页面,而谷歌显示英文界面. 原理: 根据referer头来判断 二.配置 这样配置以后,凡是从百度或者google点过来的请求都会跳转 ...

  4. KubeCon 2021|使用 eBPF 代替 iptables 优化服务网格数据面性能

    作者 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理及微服务治理经验,现负责腾讯云服务网格 TCM 数据面产品架构设计和研发工作. 引言 目前以 Istio[ ...

  5. Mac配置apache,mysql

    ===========Apache=============================== 1. 启动关闭Apache MAC系统已经预装了apache,启动.关闭.查看版本等命令如下: 启动a ...

  6. iphone4 与iphone5适配

    转:http://www.cnblogs.com/ygm900/archive/2013/05/24/3098015.html iphone4/4s 应用程序升级适配 iphone5 的方法有很多,而 ...

  7. [BUUCTF]PWN——ciscn_2019_es_2

    ciscn_2019_es_2 附件 步骤: 例行检查,32位程序,开启了nx保护 32位ida载入,shif+f12查看程序里的字符串,这边的"echo flag" 是个迷惑性的 ...

  8. VS 2019 调试 Asp.net WebApi 失败:ID为xx的进程当前未运行

    概述 解决方案 用记事本或者其他文本编辑器,从文件夹中打开启动项项目下的 .csproj 文件: 删除节点 WebProjectProperties 内的所有代码: 保存后,VS会提示全部重新加载项目 ...

  9. 资源的批量删除与替换(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 资源分配好以后,嗯,很满意! 可是!有人看了不满意,或者自己手贱分配错了,要改? 改就改呗,和分配有什么区别吗? 没有啊! ...

  10. CF616B Dinner with Emma 题解

    Content 翻译很明白,或者你也可以看我的简化版题意: 求一个 \(n\times m\) 的矩阵中每行的最小值的最大值. 数据范围:\(1\leqslant n,m\leqslant 100\) ...