1.简介
1.1简介
-
Spring主要用于解决企业应用开发的复杂性,使现有的技术更加容易使用
-
官网地址:[Spring 框架文档 (springref.com)](Spring 框架文档 (springref.com))
-
官方下载地址:repo.spring.io
-
GitHub地址:GitHub – spring-projects/spring-framework: Spring Framework
-
导入所需的依赖包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
1.2优点
- Spring是一个开源的免费框架(容器)
- Spring是一个轻量级、非入侵式的框架
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务的处理,面向框架整合的支持
总结:Spring是一个轻量级的控制反转(IOC)和面向切面编程的框架。
1.3组成
1.4拓展
- Spring Boot
- 一个快速开发的脚手架
- 基于SpringBoot可以快速开发的单个微服务
- 约定大于配置
- Spring Cloud
- SpringCloud是基于SpringBoot实现的
2.IOC理论推导
例如dao层有一个接口,三个实现类,
在业务层的实现将dao层的实现写死,如在service层的元素中UserDao userdao = new UserDaoMysqllmpl();则当用户需要调用orcale的实现的时候则需要程序员修改业务层代码UserDao userdao = new UserDaoOrcalelmpl(),耦合度太大。
所以可以在业务层调用dao层的时候使用set接口实现,直接可以让用户选择自己想要调的实现类,则不需要程序员修改业务层代码
private UserDao userdao;
//利用set注入动态实现值的注入
public void setUserDao(UserDao userdao){
this.userdao = userdao;
}
在用户层面可以直接通过**new UserService().setUserDao(new 想要调用的实现类())**即可满足需求。
- 使用set注入之后,程序不再具有主动性,而是变成被动的接受对象,大大降低了系统的耦合性,可以更加专注于在业务上的实现。
IOC本质:
- 控制反转loC(lnversionofControl),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是loC的另一种说法。没有loC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
- 采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的
- 控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(DependencyInjection,DI)。
3.HelloSpring
1.建立一个普通的类
public class Hello {
private String str;
public String getStr() {
return str;
}
//必须要有这个set注入
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "Hello{" +
"str='" + str + '\'' +
'}';
}
}
2.编写配置文件
- bean:相当于是new一个对象,bean标签里面的操作代表对象的操作
- id:对象名
- class:所要new的对象类
- property:相当于是给对象中的变量设置一个值
- name:变量名
- value:设置变量的名
- ref:可以将变量值引向另外一个bean(另外一个对象)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--使用Spring来创建对象,在Spring这些称为bean-->
<bean id="hello" class="pojo.Hello">
<property name="str" value="Spring"/>
</bean>
</beans>
3.测试
public class Mytest {
public static void main(String[] args) {
//获取Spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//我们对象现在都在Spring中的管理,我们要使用就直接去里面取就可以了
Hello hello = (Hello)context.getBean("hello");
System.out.println(hello);
}
}
4.IOC创建对象方式
1.IOC创建对象是方式可以通过无参构造,上面的例子就是通过无参构造来实现的
<bean id="hello" class="pojo.Hello">
<property name="str" value="Spring"/>
</bean>
2.当实体类的有有参构造的时候,则用IOC创建对象的方式如下
1.下标赋值
<bean id="hello" class="pojo.Hello">
<constructor-arg index="0" value="你好"/>
</bean>
2.通过类型创建
<bean id="hello" class="pojo.Hello">
<!--tpye:是类的属性的类,基本类型就可以直接写,引用类型需要用全类名-->
<constructor-arg type="java.lang.String" value="你好"/>
</bean>
3.直接通过参数名来创建
<bean id="hello" class="pojo.Hello">
<!--name:实体类的属性名,value:给属性的赋值-->
<constructor-arg name="str" value="你好"/>
</bean>
在配置文件加载的时候,容器(bean里面)中管理对象就已经初始化了,多个对象获取一个bean,其实获取的地址都是一样的,都是同一个对象。
eg:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Hello hello = (Hello)context.getBean("hello");
Hello hello2 = (Hello)context.getBean("hello");
hello == hello2,所引用的地址是一致的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84169.html