Spring企业级程序设计 • 【第1章 Spring之旅】
全部章节 >>>>
本章目录
1.4 BeanFactory与ApplicationContext的区别
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之旅】的更多相关文章
- Spring企业级程序设计作业目录(作业笔记)
Spring企业级程序设计 • [目录] 第1章 Spring之旅 >>> 1.1.6 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打 ...
- Spring企业级程序设计 • 【目录】
章节 内容 实践练习 Spring企业级程序设计目录(作业笔记) 第1章 Spring企业级程序设计 • [第1章 Spring之旅] 第2章 Spring企业级程序设计 • [第2章 Spring ...
- Spring企业级程序设计 • 【第7章 Spring框架整合】
全部章节 >>>> 本章目录 7.1 模型数据解析及控制器返回值 7.1.1 SSM框架环境搭建 7.1.1 ModelAndView多种用法 7.1.2 整合MyBati ...
- Spring企业级程序设计 • 【第5章 Spring MVC快速入门】
全部章节 >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2 S ...
- Spring企业级程序设计 • 【第2章 Spring Bean管理进阶】
全部章节 >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...
- Spring入门篇——第7章 Spring对AspectJ的支持
第7章 Spring对AspectJ的支持 介绍Spring对AspectJ的支持 7-1 AspectJ介绍及Pointcut注解应用 实例 完成了在xml文件的配置 7-2 Advice定义及实例 ...
- Spring入门篇——第6章 Spring AOP的API介绍
第6章 Spring AOP的API介绍 主要介绍Spring AOP中常用的API. 6-1 Spring AOP API的Pointcut.advice概念及应用 映射方法是sa开头的所有方法 如 ...
- Spring入门篇——第5章 Spring AOP基本概念
第5章 Spring AOP基本概念 本章介绍Spring中AOP的基本概念和应用. 5-1 AOP基本概念及特点 5-2 配置切面aspect ref:引用另外一个Bean 5-3 配置切入点Poi ...
- Spring入门篇——第4章 Spring Bean装配(下)
第4章 Spring Bean装配(下) 介绍Bean的注解实现,Autowired注解说明,基于java的容器注解说明,以及Spring对JSR支持的说明 4-1 Spring Bean装配之Bea ...
随机推荐
- Swagger2异常 java.lang.NumberFormatException: For input string: ""
问题在访问swagger首页时报错: java.lang.NumberFormatException: For input string: "" at java.lang.Numb ...
- LINUX 安装增强 前置安装文件
yum install kernel yum install kernel-devel yum install gcc yum install make
- Copy elision in C++
Copy elision (or Copy omission) is a compiler optimization technique that avoids unnecessary copying ...
- 【Linux】【Services】【Web】Nginx基础
1. 概念 1.1. 消息通知机制:同步synchronous,异步asynchronous 同步:等待对方返回信息 异步:被调用者通过状态.通知或回调通知调用者 状态:调用者每隔一段时间就需要检查一 ...
- vueAPI (data,props,methods,watch,computed,template,render)
data Vue 实例的数据对象.Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化.实例创建之后,可以通过vm.$data来访问原始数据 ...
- [PROC FREQ] 单组率置信区间的计算
本文链接:https://www.cnblogs.com/snoopy1866/p/15674999.html 利用PROC FREQ过程中的binomial语句可以很方便地计算单组率置信区间,SAS ...
- Jenkins 关闭和重启的实现方式
关闭jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/ , 那么我只需要在浏览器地址栏上敲下 htt ...
- 转:builder模式分析
建造者模式 11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制 作了,不 ...
- 【论文笔记】SamWalker: Social Recommendation with Informative Sampling Strategy
SamWalker: Social Recommendation with Informative Sampling Strategy Authors: Jiawei Chen, Can Wang, ...
- 报表(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 好吧,今天这一篇,偷懒放水,不就是[报表]嘛,想看的话一个一个功能按钮点出来看就知道是咋肥四了,我就不一一截图了哈. 嗯, ...