Spring Framework Part3 IoC and Dynamic Proxy

spring serious of blog edit by 马士兵教育

Maven方式创建Spring工程

工程创建

1.新建项目 选择Maven Project

2.勾选 Create a simple project

3.添加项目信息

l Group id :包名

l Artifact id:标识名

l Name:项目名

依赖引入

Maven 中央仓库

地址https://mvnrepository.com/

使用国内镜像

创建一个maven的配置文件

参照:

http://maven.apache.org/settings.html

Pom.xml

<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>5.1.7.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>5.1.7.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>5.1.7.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-lang3</artifactId>

<version>3.9</version>

</dependency>

空值注入

Value标签

标识空值 或空字符串 “”

<property name="name"><value></value></property>

Null标签

标识Null

<property name="name"><null></null></property>

工厂方式注入

为满足更复杂的需求,Spring也提供了工厂方式来创建更加灵活的Bean。

留意观察工厂类和实现类的创建次数

动态工厂

抽象接口 Car

public interface Car {

public String getName();

public String getPrice();

}

实现类 BMW车

public class Bmw implements Car{

public String getName() {

// TODO Auto-generated method stub

return "别摸我";

}

public String getPrice() {

// TODO Auto-generated method stub

return "500000RMB";

}

}

汽车工厂类 CarFactory

public class CarFactory {

public Car getCar(String name) throws Exception{

if (name.endsWith("bmw")) {

return new Bmw();

}else {

throw new Exception("car not fond");

}

}

}

Bean配置

<bean id="carFactory" class="com.msb.CarFactory"></bean>

<bean id="car" factory-bean="carFactory" factory-method="getCar" >

<constructor-arg value="bmw"></constructor-arg>

</bean>

静态工厂

Bean配置

<bean id="carStatic" class="com.msb.CarFactoryStatic" factory-method="getCar">

 <constructor-arg value="bmw"></constructor-arg>

</bean>

工厂类

public class CarFactoryStatic {

public static Car getCar(String name) throws Exception{

if (name.endsWith("bmw")) {

return new Bmw();

}else {

throw new Exception("car not fond");

}

}

}

autowire自动注入

使用自动需要在配置文件中bean上添加autowire

<bean id="person" class="com.msb.Person" autowire="byName">

</bean>

<bean id="pet" class="com.msb.Pet">

  <property name="name" value="kele"></property>

</bean>

实体

public class Person {

private String name;

private Pet pet;

}

public class Pet {

private String name;

}

可选两种类型

byName

byName方式自动注入:要求注入的bean的id必须和被注入的bean对象的属性名一致

byType

byType方式自动注入:要求注入的bean的对象类型与被注入的bean对象类型一致,并且在配置文件中的Bean相同类型必须唯一

如果存在多个,会抛异常:

No qualifying bean of type ‘com.msb.Pet‘ available: expected single matching bean but found 2: pet,pet2

全局空值自动注入

在首行Beans标签下添加default-autowire属性。

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans.xsd"

default-autowire="byType"

>

annotation注解注入

使用注解需要导入AOP包

在配置文件中添加Context约束

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:p="http://www.springframework.org/schema/p"

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

"

>

<context:component-scan>

<context:component-scan base-package="com.msb"></context:component-scan>

component-scan可以自动扫描包内容,并注册Bean到Spring容器

@Component

在需要注册到容器的类上添加@Component标签,标识这个类由Spring容器接管

约定大于配置

在一个类上添加@Component默认会使用首字母小写的类名作为ID注册到Spring容器。

如果需要手动指定Bean Id可以使用@Component("p")

同属@Component的额外三个注解

@Controller @Service @Repository

这三个注意在MVC开发中会经常用到,除了注解名字和Component不一样之外,其余功能都一样。

Spring额外提供这三个注解的目的主要是为了区分MVC中每个类的区别。

@Scope

使用注解注册Bean 默认的作用域还是singleton,可以使用@Scope("prototype")改变对象作用域

@Value

在使用注解给对象注入值的时候,不再需要Get/Set方法

基础类型

使用@Value注解

@Value("小明")

private String name;

对象引用

@Autowired

private Pet MyPet;

使用@Autowired注解

默认是ByType的,如果需要ByName需要配合@Qualifier注解

@Autowired()

@Qualifier("p2")

private Pet MyPet;

面向切面编程 代码增强 

AOP(Aspect Oriented Programming)面向切面编程。

面向切面,是与OOP(Object Oriented Programming)面向对象编程并列的编程思想。

Spring支持两种方法,那么我们在使用spring进行动态代理时究竟使用的哪一种方法呢?spring优先支持实现接口的方式,如果没有接口则使用cglib方式

代理 

通过代理可以隐藏目标类的具体实现;在不修改目标类代码的情况下能够对其功能进行增强。

l 委托类和代理类有相同的接口或者共同的父类

l 代理类为委托类负责处理消息,并将消息转发给委托类

l 委托类和代理类对象通常存在关联关系

l 一个代理类对象与一个委托类对象关联

l 代理类本身并不是真正的实现者!而是通过调用委托类的方法来实现功能!

静态代理

使用硬编码的方式增强原有方法

l 优点:可以做到不对目标对象进行修改的前提下,对目标对象进行功能的扩展和拦截。

l 缺点:因为代理对象,需要实现与目标对象一样的接口,会导致代理类十分繁多,不易维护,同时一旦接口增加方法,则目标对象和代理类都需要维护。

Girl -> 目标对象 -> 被包装/增强的对象

public class Girl implements Human{

public void eat() {

System.out.println("Em mmm.. mm..");

}

}

抽象接口

interface Human {

public void eat();

}

ProxyGirl 代理对象,包含对原对象方法的增强,通过构造方法传入原对象,并实现和原对象相同的接口,实现接口方法,便可以利用Java多态的特性,通过访问代理方法同时能够调起原对象的实现,并对其增强。

public class ProxyGirl implements Human {

private Human human;

public ProxyGirl() {

super();

}

public ProxyGirl(Human human) {

super();

this.human = human;

}

public void eat() {

System.out.println("chiqian");

human.eat();

System.out.println("chihou");

}

}

测试类

Girl girl = new Girl();

Human proxyGirl = new ProxyGirl(girl);

proxyGirl.eat();

动态代理

动态代理是指动态的在内存中构建代理对象(需要我们制定要代理的目标对象实现的接口类型),即利用JDK的API生成指定接口的对象,也称之为JDK代理或者接口代理。

l 目标对象实现了接口 JDK动态代理

l 目标对象没有实现口CGLib

JDK动态代理

CGLIB动态代理

底层ASM

原文地址:https://www.cnblogs.com/littlepage/p/11018921.html

时间: 2024-10-21 01:36:45

Spring Framework Part3 IoC and Dynamic Proxy的相关文章

Spring技术内幕——Spring Framework的IOC容器实现(一)

一.SpringIOC容器概述 IOC容器和依赖反转的模式 在面向对象的系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架IOC容器来完成.他可以再解耦代码的同时提高了代码的可测试性. 依赖控制反转的实现由很多种方式,在Spring中,IOC容器是实现这个模式的载体,他可以再对象生成或者初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖.这种依赖注入是可以递归的,对象被逐

Spring Framework Part2 IOC

spring serious of blog edit by 马士兵教育 IoC概念 IoC是一个概念,是一种思想,其实现方式多种多样.当前比较流行的实现方式之一是DI. 基于XML的DI ApplicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

Spring技术内幕——Spring Framework的IOC容器实现(二)

三.IOC容器的初始化过程 IOC容器的初始化时由前面介绍的refresh方法来启动的,这个方法标志着IOC容器的正式启动.这个启动包括BeanDefinition的Resource定位.载入和注册.下面我们将详细分析这三个实现过程,Spring把这三个过程分开,并使用不同的模块来完成,通过这样的设计让用户更加灵活的这三个过程进行剪裁和扩展,定义出最适合自己的IOC容器的初始化过程. 第一个过程: Resource定位过程,是指BeanDefinition的资源定位,他由ResourceLoad

Spring技术内幕——Spring Framework的IOC容器实现(三)

接上一篇的时序图.这里调用的loadBeanDefintions实际上是一个抽象方法,那么实际载入过程发生在哪里呢?在loadBeanDefintions中,初始化了读取器XMLBeanDefinitionReader,然后把这个读取器在IOC容器中设置好(过程和编程式使用XMLBeanFactory是类似的),最后是启动读取器来完成BeanDefinition在IOC容器中的载入,代码如下: /** * Convenient base class for {@link org.springfr

Spring Framework之IoC容器

目录 Spring IoC 概述 问题 依赖倒置原则 (Dependency Inversion Principle) 控制反转 (Inversion of Control) 依赖注入(Dependency Inversion) 依赖倒置原则 .控制反转 .依赖注入的关系 优点 IoC 容器 BeanFactory ApplicationContext IoC容器的依赖注入 基于注解定义Bean 自动装配 @Resource @Autowired @Qualifier 基于Java类配置 @Be

Spring技术内幕——Spring Framework的IOC容器实现(五)(大结局)

这里通过使用BeanDefinitionResolver来对BeanDefinition进行解析,然后注入到property中.下面到BeanDefinitionValueResolver中看一下解析过程,以对Bean reference进行解析为例 /** * Resolve a reference to another bean in the factory. * class BeanDefinitionValueResolver */ private Object resolveRefer

JavaIOC框架篇之Spring Framework

欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝的角度去观察(了解)Java体系.使Java的各种后端技术在你心中模块化:让你在工作中能将Java各个技术了然于心:能够即插即用.本篇我们一起来了解SpringIOC相关知识以及其核心点. 目前Java体系常见的IOC框架有Google Guice,PicoContainer,Dagger,Spri

Spring Framework(2):深入理解IoC和AOP

Deployment期间验证 实现一: 1 <bean id="theTargetBean" class="..."/> 2 3 <bean id="theClientBean" class="..."> 4 <property name="targetName"> 5 <idref bean="theTargetBean" /> 6 &l

Hello Spring Framework——面向切面编程(AOP)

本文主要参考了Spring官方文档第10章以及第11章和第40章的部分内容.如果要我总结Spring AOP的作用,不妨借鉴文档里的一段话:One of the key components of Spring is the AOP framework. While the Spring IoC container does not depend on AOP, meaning you do not need to use AOP if you don’t want to, AOP comple