目录
6.BeanFactory和ApplicationContext的区别
7.1通过配置文件中bean标签的id的值获取bean(使用默认构造方法)
1.spring概述
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的.
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.
核心:
控制反转:IOC——Inversion of Control,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。 指的是将对象的创建权交给 Spring 去创建。使用 Spring 之前,对象的创建都是由我们自己在代码中new创建。而使用 Spring 之后。对象的创建都是给了 Spring 框架。
面向切面:AOP-面向切面编程在不改变源代码的前提下可以扩充功能
2.spring特点
1)方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。
2)方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
3)降低 Java EE API 的使用难度
Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低。
4)方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
5)AOP 编程的支持
Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
6)声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。
3.为什么使用spring
目的: 降低耦合度
4.耦合概述
耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。耦合性存在于各个领域,而非软件设计中独有的,但是我们只讨论软件工程中的耦合。在软件工程中,耦合指的就是就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。
它有如下分类:
(1)内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
(2)公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
(3) 外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
(4) 控制耦合 。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。
(5)标记耦合 。若一个模块 A 通过接口向两个模块 B 和 C 传递一个公共参数,那么称模块 B 和 C 之间存在一个标记耦合。
(6) 数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。
(7) 非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。
总结:耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。
内聚与耦合:内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。 程序讲究的是低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却要不那么紧密。内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合。
5.如何使用spring
(1)引入相关的依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
</dependencies>
(2)创建Spring的配置文件 (在resources下创建application.xml)
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--表示一个类交于spring容器来创建
id:bean的唯一标识。
class: 类的全路径
-->
<bean id="UserDao" class="com.tym.dao.UserDao"></bean>
<bean id="people" class="com.tym.dao.PeopleDao"></bean>
</beans>
(3)创建接口
package com.tym.aaa;
public interface IUser {
public void show();
}
(4)创建UserDao并实现IUser接口
package com.tym.dao;
import com.tym.aaa.IUser;
public class UserDao implements IUser {
public UserDao(){
System.out.println("userdao的构造方法");
}
public void show() {
System.out.println("=======");
}
}
(5)测试
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
public class Test1 {
public static void main(String[] args) {
//读取spring配置文件
ApplicationContext ap = new ClassPathXmlApplicationContext("application.xml");
//获取bean对象
IUser usrDao = (IUser) ap.getBean("UserDao");
usrDao.show();
}
}
6.BeanFactory和ApplicationContext的区别
BeanFactory(容器顶层接口 ) :获取Bean对象;管理类和类之间的关系(依赖关系)BeanFactory由org.springframework.beans.factory.BeanFactory接口定义 BeanFactory是工厂模式(Factory pattern)的实现,是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖
BeanFactory基本方法:
containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true。
Object getBean(String str) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常。
Object getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型
Class getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常
boolean isSingleton(String) 判断给定名称的bean定义是否为单例模式
String[] getAliases(String name) 返回给定bean名称的所有别名
ApplicationContext接口:是基于BeanFactory之上的,提供了应用程序框架服务,扩展的新功能如下:提供国际化的支持资源访问,如URL和文件 事件传递载入多个配置文件等
实现类常见有三个:
ClassPathXmlApplicationContext:-classpath路径加载xml文件的
FileSystemXmlApplicationContext:基于项目根路径进行加载xml文件的
AnnotationConfigApplicationContext:基于注解的配置。基于类书写的配置。
package com.tym.aaa;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
public class Test1 {
public static void main(String[] args) {
//在加载spring容器时,spring会把配置文件中所有的bean创建好。
ApplicationContext ap = new ClassPathXmlApplicationContext("application.xml");
//IUser usrDao = (IUser) ap.getBean("UserDao");
// usrDao.show();
}
//public static void main(String[] args) {
// ClassPathResource resource = new ClassPathResource("application.xml");
// XmlBeanFactory factory = new XmlBeanFactory(resource);
//拿到哪个bean时才会调用构造函数创建该bean
// IUser userDao = factory.getBean("UserDao", IUser.class);
// userDao.show();
//
//}
}
面试题:BeanFactory 和 ApplicationContext 的区别:
BeanFactory 才是 Spring 容器中的顶层接口。
ApplicationContext 是它的子接口。
单例模式下创建对象的时间点不一样:
ApplicationContext:(饿汉模式)只要一读取配置文件,马上就会创建配置文件中配置的对象。
BeanFactory:(懒汉模式)什么时候getBean("id"),也就是说当根据id获取对象时,才会创建。
7.获取bean的方式
7.1通过配置文件中bean标签的id的值获取bean(使用默认构造方法)
//根据bean的id获取Bean对象,要强制转换.
IUserDao iUserDao= (IUserDao) app.getBean("userDao")
7.2通过类型去获取
IUserDao userDao = app.getBean(IUserDao.class);
7.3通过id+类型获取
IUser userDao = factory.getBean("UserDao", IUser.class);
8. bean的作用范围
范围调整需要配置scope属性在配置文件<bean scope=""/>
singleton:单例的(默认值)当加载配置文件时,就会创建对象。(无论创建多少次对象 他们始终指向同一个实例 )
prototype:多例的(当getBean时才会创建对象)
request:作用于请求范围,同一个那么使用bean同一个。
session:作用于会话范围,同一个会话
9.DI概述
依赖注入(Dependency Injection):目的就是给对象中的属性赋值。
IOC控制反转的最终目的就是降低程序的耦合,也就是削减依赖关系。
依赖关系的管理以后都交给spring维护,依赖关系的管理就称之为依赖注入。也就是说在当前类需要用到其它类的对象时,由spring为我们提供,我们只需要在配置文件中说明依赖关系的维护就可以了。
10.如何实现注入对象的属性值
10.1基本类和字符串类型时
(1) 创建一个类并有set方法
package com.tym.dao;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class StudentDao {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "StudentDao{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
(2) 配置文件:在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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="StudentDao" class="com.tym.dao.StudentDao">
<!--property:表示为类中属性注入值,调用的为set方法
name:表示属性名
value:注入基本类和字符串类型时使用value
-->
<property name="name" value="张三"/>
<property name="age" value="22"/>
</bean>
10.2注入对象类型
10.3注入集合类型
10.4注入set和map集合
11.自动注入
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
autowire:自动注入属性
no:默认 不设置自动注入
byName:按照属性名称自动注入属性值
byType:按照属性类型自动注入
-->
<bean id="UserController" class="com.tym.demo1.UserController" autowire="byType">
</bean>
<bean id="UserDao01" class="com.tym.demo1.UserDao01">
</bean>
<!-- <bean id="UserDao02" class="com.tym.demo1.USerDao02">
</bean>-->
</beans>
12.使用注解完成IOC和DI功能
(1)包扫描配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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 https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.tym.demo2"/>
</beans>
(2)
总结:
@Controller @Respository @Service @Component:没有区别: 他们的底层都是用@Component
实际意思就在于区分层的。
@Controller控制层
@Respository持久化层
@Service 业务层
@Component 最底层的bean注解。