当前位置: 首页 > wzjs >正文

济南网站建设方案详细做空压机网站的公司有哪些

济南网站建设方案详细,做空压机网站的公司有哪些,网站制作公司加盟,千图网素材下载网站SpringBoot入门-(2) Spring IOC机制 Spring Spring是一个当前主流的轻量级的框架,发展到形状已经不仅仅是一个框架,而是形成以Spring为基础的生态圈,如(Spring Boot,Spring Cloud,Spring Security等) Spring 两大核心技术 控制反转(IoC)面…

SpringBoot入门-(2) Spring IOC机制

Spring

Spring是一个当前主流的轻量级的框架,发展到形状已经不仅仅是一个框架,而是形成以Spring为基础的生态圈,如(Spring Boot,Spring Cloud,Spring Security等)

Spring 两大核心技术

  • 控制反转(IoC)
  • 面向切面编程(AOP)

本文先介绍其一

控制反转(IoC/DI)

依赖注入(DI:Dependency Injection ):Spring通过创建容器的方式,来负责对象的创建、对象和对象之间关系的维护等

动机

在面向对象的系统设计中,底层的业务逻辑是由多个对象组成,对象之间通常存在复杂的联系,导致系统的耦合度很高,例如:

public class UserServiceImp implements UserService{private UserDao userdao = new UserDaoImp();...}

上述UserServiceImp类实现UserService接口,其中创建的私有成员变量是通过UserDaoImp类创建出来的实例。

UserDaoImp的业务逻辑产生变化或出现错误,都有可能需要修改UserServiceImp的代码,所谓产生了"牵一发而动全身"的系统高耦合度。

不难发现,系统越庞大,对象关系越复杂,系统耦合度越高,导致系统维护愈发困难。

因此,Spring横空出世,解决对象之间耦合度过高的问题。后来从产品发展为生态圈。

概念

究竟什么是控制反转?

先看下图:

在这里插入图片描述
首先是左图的情况,假设其他一个齿轮需要修改或不转动,都会导致其他的齿轮停止工作,这称为高耦合度。而右图,齿轮之间不存在依赖关系,工作相对独立,不会影响到其他齿轮的正常工作。这表现的就是"控制反转"的基本思想:

借助于“第三方”实现具有依赖关系的对象之间的解耦

齿轮之间的传动全部依靠“第三方”了, 全部对象的控制权全部上缴给“第三方”IOC容器,主动创建变为了被动注入, 这就是“控制反转”(依赖注入)这个名称的由来

代码

首先创建Maven项目(传送门:SpringBoot入门-(1) Maven【概念+流程】-CSDN博客),pom.xml文件导入相关spring依赖,包括测试依赖:

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test</scope></dependency></dependencies>

注意,这里没有定义依赖的版本,是通过父项目统一管理版本号

without Spring

我们先用常规的MVC架构实现一些简单逻辑,后面对比Spring架构就可以明显发现其优势和作用。

首先我们实现一个非常简易的商品存入数据库的逻辑:

在这里插入图片描述
部分代码如下:

  • ProductDaoImpl

    package com.example.Dao;import com.example.Dao.ProductDao;
    import com.example.entity.Product;public class ProductDaoImpl implements ProductDao {//这里是模拟商品存入,并没有真正存入数据库@Overridepublic void saveProduct(Product product) {System.out.println("保存商品信息");System.out.println(product.toString());}
    }
    
  • ProductServiceImpl

    package com.example.Service;
    import com.example.entity.Product;
    import com.example.Dao.*;public class ProductServiceImpl implements ProductService{private ProductDao productDao =  new ProductDaoImpl();//其他业务逻辑,如检查是否合法等@Overridepublic void saveProduct(Product product) {productDao.saveProduct(product);}
    }
    

可以看到在ProductServiceImpl中,我们通过new的方式创建实例对象并赋值给成员变量

测试代码:

test目录底下进行测试:

package com.example.Service;import com.example.entity.Product;
import org.junit.jupiter.api.Test;public class ProductServiceTest { //如果 Calculator 类和测试类处于相同的包或者符合 Java 的包访问规则,那么测试类就可以直接访问 ProductServiceImpl 类。@Testpublic void testSaveProduct() {ProductService productService = new ProductServiceImpl();productService.saveProduct(new Product(0, "test",12.7));}
}

可以看到控制台输出信息:
在这里插入图片描述

with spring

我们现在使用spring框架实现相同的功能

  • 方式一:配置文件

首先新建spring的配置文件,如图:
在这里插入图片描述

命名为applicationContext,可以看到文件中已经存在默认的内容(默认生成的XML文件的NameSpace,<bean>就是关键的标签。

容器中创建对象,本质就是在文件中配置一个bean

<beans></beans>中间添加我们想要创建的对象及注入依赖

    <bean id="productDao" class="com.example.Dao.ProductDaoImpl"/><bean id="productService" class="com.example.Service.ProductServiceImpl"><property name="productDao" ref="productDao"/></bean>

容器通过com.example.Dao.ProductDaoImpl类创建id为productDao的对象

对象属性的赋值通过<property>标签,需要在com.example.Service.ProductServiceImpl提供对应的setter方法:

    public void setProductDao(ProductDaoImpl productDao) {this.productDao = productDao;}

下一步,在测试程序中创建容器,并获取指定对象进行测试。

public class ProductServiceTest {//如果 Calculator 类和测试类处于相同的包或者符合 Java 的包访问规则,那么测试类就可以直接访问 ProductServiceImpl 类。@Testpublic void testSaveProduct() {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");ProductService productService = (ProductService) ac.getBean("productService");productService.saveProduct(new Product(0, "test",12.7));}
}

上述代码中,我们先创建了容器,然后根据xml文件中的配置获取对象,返回的类型是Object,注意转换类型。

观察到上述两种方式,spring将层与层之间的联系解耦,可以比较一下下面两段代码:

//解耦前
private ProductDao productDao =  new ProductDaoImpl();//spring
private ProductDao productDao;
//在配置文件中注入依赖
<bean id="productService" class="com.example.Service.ProductServiceImpl"><property name="productDao" ref="productDao"/>
</bean>

这样,我们在"更换齿轮"的时候就不用去修改Service层的代码,修改配置文件即可。(注意,配置文件依赖注入一定要在相应的地方添加setter方法,底层会进行调用)

  • 方式二: 注解实现IOC
  1. 注解+配置

当我们的项目很大的时候,使用配置文件就会出现问题,配置文件信息内容过大让人眼花缭乱,所以spring提供了注解的方式。

在这里插入图片描述
根据注解,我们可以把配置文件中的:

<bean id="productDao" class="com.example.Dao.ProductDaoImpl"/>

等效为:

@Repository("productDao")
//如果不给注解起名字,默认的名字为类名(首字母小写)
public class ProductDaoImpl implements ProductDao {//这里是模拟示范@Overridepublic void saveProduct(Product product) {System.out.println("保存商品信息");System.out.println(product.toString());}
}

Spring 默认不使用注解装配 Bean,因此我们需要在 Spring 的 XML 配置中,通过**context:component-scan** 元素开启 Spring Beans的自动扫描功能

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

其中base-package是你希望自动扫描的路径。

Bean的自动装配

使用@AutoWired注解实现自动装配,如:

public class ProductServiceImpl implements ProductService{@Autowiredprivate ProductDao productDao;
  1. 全注解

不使用spring配置文件,而是进行全注解开发,因此我们需要使用注解写一个配置类实现和annotation.xml的功能。

在config/目录下创建类文件:

@Configuration
@ComponentScan("com.example")
public class SpringConfig {
}

对应的测试代码:

    @Testpublic void testSaveProduct() {ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);ProductService productService = ac.getBean("productService", ProductService.class);

当然也可以在配置类中使用@Bean标签

@Configuration
@ComponentScan("com.example")
public class SpringConfig {@Bean(name = "productService")public ProductServiceImpl creat(){return new ProductServiceImpl();}
}

对应的测试代码修改一句即可:

ProductService productService = ac.getBean(ProductService.class);


文章转载自:

http://gaiwZ87b.Ldhyh.cn
http://fp1JgFJj.Ldhyh.cn
http://hVkzF1pr.Ldhyh.cn
http://oAimjfhb.Ldhyh.cn
http://0RedCzOn.Ldhyh.cn
http://aIj2CmNC.Ldhyh.cn
http://R0Rn4jjy.Ldhyh.cn
http://UtgGJqyO.Ldhyh.cn
http://rdYhtB40.Ldhyh.cn
http://GTujNWzk.Ldhyh.cn
http://jVsjcffT.Ldhyh.cn
http://dsx7XvDU.Ldhyh.cn
http://OcioFZdk.Ldhyh.cn
http://yS8L1jPx.Ldhyh.cn
http://snJHIjLE.Ldhyh.cn
http://xJ2JeuCo.Ldhyh.cn
http://kXyLR2NP.Ldhyh.cn
http://1r116r28.Ldhyh.cn
http://mIVnqU65.Ldhyh.cn
http://7j0v7tE2.Ldhyh.cn
http://SfBR7IGg.Ldhyh.cn
http://S9annzd3.Ldhyh.cn
http://lXSTW57y.Ldhyh.cn
http://rVd8YYAd.Ldhyh.cn
http://8xrS901W.Ldhyh.cn
http://Q3IZq8tM.Ldhyh.cn
http://iYDAD4P0.Ldhyh.cn
http://C3NHJV49.Ldhyh.cn
http://x9vaYEQW.Ldhyh.cn
http://KqMyQqCM.Ldhyh.cn
http://www.dtcms.com/wzjs/733827.html

相关文章:

  • 网站排版图片企业网站欣赏郑州企业形象设计
  • 网站的打开速度做的网站乱码怎么搞
  • 拓吧网站站长之家ip地址归属查询
  • WordPress导出单页seo排名推广工具
  • 网站核验单 没有网站 怎么办网站注册协议
  • 比较有名的网站建设公司做彩票网站需要什么
  • 专业的建设网站想做网站制作运营注册什么公司核实
  • 做网站的私活做电脑系统网站
  • 如何制作网站平台做网站如何赚钱知乎
  • 昆山网站建设培训word模板免费下载
  • 网站右下角视频代码邢台哪里有做网站的
  • 重庆网站设计哪家好温州网站建设这个
  • 十堰电商网站建设看过的网站做记号
  • 可信的郑州网站建设购买域名如何建设网站
  • 聊城做wap网站找谁化工外贸网站建设
  • 自动生成网页的工具企业网站seo推广
  • 律师事务所公司类网站建设案例06年可以做相册视频的网站
  • 网站开发问卷调查海澜之家网站建设水平
  • 网站建设和优化需要几个人建设工程合同的内容
  • 做彩票网站模板网站建设中界面模板下载
  • 长沙建站找有为太极环境遵商务网站建设与维护流程
  • 农八师建设兵团社保网站中国材料价格网
  • 北京住房建设部网站首页建设银行储蓄卡余额查询系统
  • 建立企业网站选什么好中国网站开发用盗版犯法
  • 杭州网站建设及推广网络舆情处置工作方案
  • 微网站怎么免费做大连网页设计制作公司
  • 海外免费网站推广有哪些千锋教育出来好找工作吗
  • 企业营销网站wordpress小夜
  • 巧克力网站模板唐山电商网站建设
  • 建设工程资料网站wordpress ip地址修改