Spring【持续学习笔记】

Spring简介

Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。

Spring总结起来优点如下:

  • 低侵入式设计,代码的污染极低。
  • 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。
  • Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。
  • Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
  • Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。
  • Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。

Spring的核心机制

管理Bean

程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:

  • ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。
  • FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
public class BeanTest{
    public static void main(String args[]) throws Exception{
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        Person p = ctx.getBean("person", Person.class);
        p.say();
    }
}

  当一个Bean既使用自动装配依赖,又使用ref显式指定依赖时,则显式指定的依赖覆盖自动装配依赖;对于大型的应用,不鼓励使用自动装配。虽然使用自动装配可减少配置文件的工作量,但大大将死了依赖关系的清晰性和透明性。依赖关系的装配依赖于源文件的属性名和属性类型,导致Bean与Bean之间的耦合降低到代码层次,不利于高层次解耦。

<!--通过设置可以将Bean排除在自动装配之外-->
<bean id="" autowire-candidate="false"/>

<!--除此之外,还可以在beans元素中指定,支持模式字符串,如下所有以abc结尾的Bean都被排除在自动装配之外-->
<beans default-autowire-candidates="*abc"/>

<!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中 id 属性:对象的唯一标识。 class 属性:指定要创建对象的全限定类名 --> 
<!-- 配置 service -->

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> </bean> 
<!-- 配置 dao -->

<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean>

IOC 中 bean 标签和管理对象细节
1. bean 标签 

作用:
用于配置对象让 spring 来创建的。  默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
属性: 
id:给对象在容器中提供一个唯一标识。用于获取对象。 
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。  
* singleton :默认值,单例的。
* prototype :多例的。
* request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中。
* session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
* global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么 globalSession 相当于 session。
init-method:指定类中的初始化方法名称。
destroy-method:指定类中销毁方法名称。 

2 bean 的作用范围和生命周期 

单例对象:scope="singleton" 
    一个应用只有一个对象的实例。它的作用范围就是整个引用。 
    生命周期: 
        对象出生:当应用加载,创建容器时,对象就被创建了。 
        对象活着:只要容器在,对象一直活着。 
        对象死亡:当应用卸载,销毁容器时,对象就被销毁了。 
多例对象:scope="prototype"
    每次访问对象时,都会重新创建对象实例。 
    生命周期: 
        对象出生:当使用对象时,创建新的对象实例。 
        对象活着:只要对象在使用中,就一直活着。 
        对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。 

基础用法:

1. 新建一个接口如:

 

 2. 创建一个类继承接口重写方法:

 

 3.新建 applicationContext.xml文件编辑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" xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    <!-- 由 Spring容器创建该类的实例对象 -->
    <bean id="add" class="com.example.demo.User" />
</beans>

4.创建测试类:

package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class cs {
    @Test
    public void cs1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Users user1 = (Users) context.getBean("add");
        user1.add();
    }
}

测试结果如下:

 

 Spring 名命空间

 1.c命名空间注入和p命名空间注入

编辑bean.xml文件的头目录里面加上两行约束

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

2. 使用

<bean id="address1" class="com.k.pojo.user" p:name="xxx"/>
<bean id="address2" class="com.k.pojo.user" c:name="xxx"/>

 

常用使用注解:

用于创建对象的  【相当于:<bean id=" " class=" ">

1. @Component

作用: 把资源让 spring 来管理。相当于在 xml 中配置一个 bean。 属性: value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。

2. @Controller @Service @Repository

他们三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。

他们只不过是提供了更加明确的语义化。

  @Controller:一般用于表现层的注解。

  @Service:一般用于业务层的注解。

  @Repository:一般用于持久层的注解。

细节:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写。

2. 用于注入数据的

相当于:<property name="" ref="">
<property name="" value="">

2.1 @Autowired

作用:

  自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。当有多个 类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到 就报错。

2.2 @Qualifier

作用:

  在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和 @Autowire 一起使用;但是给方法参数注入时,可以独立使用。

属性:

  value:指定 bean 的 id

2.3 @Resource

作用:

  直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。

属性:

  name:指定 bean 的 id。

2.4 @Value

作用:

  注入基本数据类型和 String 类型数据的

属性:

  value:用于指定值

posted @ 2020-06-10 14:55  皮一皮很开心  阅读(151)  评论(0编辑  收藏  举报