Spring知识、难点、用法总结

简介:

 

  1. Spring是什么
  1. Spring 是一个开源框架.
  2. Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能.
  3. Spring 是一个 IOC(DI) 和 AOP 容器框架.
  1. Spring的作用

1)用来整合其他框架,可以让程序的结构更为松散,实现低耦合

2)简化事务控制,实现声明式事务(相对于编程式事务来言)

  1. 具体描述

具体描述 Spring:

轻量级Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API

依赖注入(DI --- dependency injection、IOC)

面向切面编程(AOP --- aspect oriented programming)

容器: Spring 是一个容器, 因为它包含并且管理应用对象的生命周期

框架: Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 和 Java 注解组合这些对象

一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)

  1. Spring模块组成

 

  1. 两个核心思想:
    1. IOC&DI:

IOC控制反转 Inversion of Control

所谓的 IOC:是指将某一类对象的控制权(对象创建和方法调用)交给外部容器来负责。

DI:依赖注入 Dependency Inject

所谓 DI:对象依赖的属性,由容器给此属性赋值的过程

AOP

aop:面向切面编程

 

IOC控制反转

在spring之前,我们程序中需要一个对象实例是直接通过new的方式来创建,或者通过对象工厂的方式来创建,而在spring中,是通过IOC控制反转的方式来创建实例,简单来说就是不用显示的new对象,而是将对象的创建交给spring来实现。这样对象创建的控制权就由应用内转向了应用外,由此形成控制反转。

<bean id="human" class="spring1.Human"></bean>:通过bean标签来定义实例,class属性指定类的全限定类名,id为唯一标识,在整个应用内id应该唯一。id由自己命名。

 

bean的作用域(重点)

spring中的bean默认为单例模式,即spring容器创建的bean在整个应用声明周期内,仅有一个实例,若需要修改为非单例模式可以通过为bean的scope属性指定值prototype实现。

bean的生命周期

生命周期指bean实例从创建到销毁的整个过程,通过spring提供的回调方法实现。定义bean时指定两个回调方法,控制bean的初始化和销毁时的动作。

  1. Init-method:定义初始化的时候的回调方法,该方法会在实例初始化完成后及时执行,即在构造方法之后执行;
  2. Destory-mehtod:定义对象销毁时的回调方法,该方法会在实例被销毁的时候执行。

 

配置三层注入:

第一种写法:

        <!-- 1、配置dao层bean -->
		<bean id="userDao" class="com.spring.dao.impl.UserDaoImpl"/>
		
		
		<!-- 2、配置service层bean -->
		<bean id="userService" class="com.spring.service.impl.UserServiceImpl">
			<!-- 引用dao对象属性 -->
			<property name="userDao" ref="userDao"/>
		</bean>
		
		
		<!-- 3、配置servlet层bean -->
		<bean id="userServlet" class="com.spring.web.UserServlet">
			<!-- 引用service对象属性 -->
			<property name="userService" ref="userService"/>
		</bean>

id由自己命名。name:类中属性名

第二种写法:

自动装配概述

自动装配是使用spring满足bean依赖的一种方法,在依赖的过程中spring会在应用上下文中为某个bean寻找其依赖的bean。

    1. 在xml中实现自动装配

5种自动装配模式

模式

描述

no

这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。

byName

由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。

byType

由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。

constructor

类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。

autodetect

Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。

      1. 局部配置

在有依赖的bean标签中使用autowire="byName",只对当前bean自动装配

<bean id="userDao" class="com.spring.dao.impl.UserDaoImpl"></bean>
        
<bean id="userService" class="com.spring.service.impl.UserServiceImpl" autowire="byName"/>
           
<bean id="userServlet" class="com.spring.web.UserServlet" autowire="byName"/>
        
      1. 全局配置

在xml标签加入default-autowire="byName",所有有依赖的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-4.2.xsd" default-autowire="byName">
       
        <bean id="userDao" class="com.spring.dao.impl.UserDaoImpl"></bean>
        
        <bean id="userService" class="com.spring.service.impl.UserServiceImpl" />
           
        
        <bean id="userServlet" class="com.spring.web.UserServlet" />
        
</beans>
    	

Spring注解:

通过注解生成的对象默认对象名是当前类首字母小写。

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"
		xmlns:context="http://www.springframework.org/schema/context"
		xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd
		" default-autowire="byName">
       
        <context:component-scan base-package="com.spring"/>
        
</beans>
    	

​​​​​​​为Bean注入简单类型属性

    1. 在属性名上方声明该属性自动装配@Autowired
    2. 在属性名上方声明该属性注入的值@Value(value)

 

@Autowired

@Value("张三")

private String name;

@Autowired

@Value("18")

private int age;

PS:注解自动装配属性值无需提供对应属性的setter方法

    1. 为Bean注入引用类型属性
    1. 在属性名上方声明该属性自动装配@Autowired
    2. 在属性名上方声明该属性注入的值@Qualifier(bean引用名称【name|id】)

PS:被注入的Bean一定要存在,无需提供对应属性的setter方法;

被注入的bean若在整个应用中仅有一个实例则可以不用@Qualitfier

(一个接口下有多个实现类,则需要使用到@Qualitfier

@Service("service1")
public class EmployeeServiceImpl implements EmployeeService {
    public EmployeeDto getEmployeeById(Long id) {
        return new EmployeeDto();
    }
}

@Service("service2")
public class EmployeeServiceImpl1 implements EmployeeService {
    public EmployeeDto getEmployeeById(Long id) {
        return new EmployeeDto();
    }
}
public class EmployeeInfoControl {
    
@Autowired
@Qualifier("service1")
    EmployeeService employeeService;
     
    @RequestMapping(params = "method=showEmplayeeInfo")
    public void showEmplayeeInfo(HttpServletRequest request, HttpServletResponse response, EmployeeDto dto) {
        #略
    }
}

​​​​​​​@Autowired注解属性required用于声明自动装配的数据是否是必须的

如果required=true,必须为其装配数据,如果没有值,抛出异常

如果required=false,自动装配数据失败,则注入值为null

@Autowired(required = true)

@Value("张三")

private String name;

@Autowired(required = false)

private int age;

PS:默认值为true

 

 

​​​​​​​Bean作用域注解

在类的定义上方添加@Scope指定Bean的作用域

常用:@Scope("prototype")

默认:@Scope("singleton")

PS:要求当前类被注册为Bean,否则无效果

 

​​​​​​​Bean的兼容格式

Spring提供了3个注解开发Bean的兼容格式,用于后期分层设计扩展,可以将这3个注解理解为@Component的子注解。在spring+mybaitis集成时会应用到。

@Repository 用于数据层实现类标注(DAO)

@Service 用于业务逻辑层实现类标注(service)

@Controller 用于控制层实现类进行标注(控制层)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值