首页 > 其他分享 >Spring

Spring

时间:2022-12-05 12:33:06浏览次数:54  
标签:-- Spring private bean import 注入

组成

  • Spring Core:核心容器,BeanFactory提供了组件生命周期的管理,组件的创建、装配,销毁等功能。

  • SpringContext:实现了ApplicationContext接口,Spring的上下文,拓展了核心容器,提供事件处理、国际化等功能。它还提供了一些企业级服务的功能,提供了JNDI、EJB、RMI的支持。

  • Spring Web:拓展了Spring上下文,提供Web应用上下文,对Web开发提供功能上的支持,如请求、表单、异常等。

  • Spring DAO:提供对JDBC的支持,还提供了DAO的支持,提供事务支持。

  • Spring ORM:对现有的O/R Mapping封装或支持。

  • Spring AOP:提供切面支持,是个轻量级的容器。

  • Spring Web MVC:全功能MVC框架,作用等同于Struts。

组成
组成

IOC本质

IOC是一种思想,而依赖注入(DI)只是它的一种实现。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式,Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(DI)。

hello

实体类

package com.depressiom.pojo;

import lombok.Data;

/**
 * @ClassName Hello
 * @Description hello spring
 * @Date 2022/12/2
 * @Author depressiom
 */
@Data
public class Hello {
    private String str;
}

bean配置文件官网地址 https://docs.spring.io/spring-framework/docs/current/reference/html/core.html

<?xml version="1.0" encoding="UTF8"?>
<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
        在Java中,要想创建一个对象,一般为 类型 变量名 = new 类型();
        在Spring中,一个bean就相当于new 对象,其中id相当于变量名,
        class相当于对象(类型),property相当于给对象中的属性设值
        -->
    <bean id="hello" class="com.depressiom.pojo.Hello">
        <property name="str" value="Spring"/>
    </bean>
  </beans>

测试

@Test
    public void test(){
        // 获取Spring的上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        // 对象都在Spring中管理了,要使用,直接通过bean绑定的id 取出来
        Hello hello = (Hello) context.getBean("hello");
        System.out.println(hello.toString());
    }

这个过程就叫做控制反转

  • 控制:谁来控制对象的创建,传统应用程序的对象由程序本身控制创建,使用Spring后,对象是由Spring来创建的

  • 反转:程序本身不创建对象,而变成被动的接收对象

  • 依赖注入:就是利用set方法来进行注入的

所谓的IOC:对象由Spring来创建,管理,装配

IOC创建对象的方式

  • 默认使用无参构造方法创建对象
    无参构造方法

  • 使用有参构造方法创建对象

<!--  第一种通过下标赋值  -->
<!--    <bean id="user" class="com.depressiom.pojo.User">-->
<!--        <constructor-arg index="0" value="Test"/>-->
<!--    </bean>-->
    <!--  第二种方式,通过type创建  不建议使用-->
<!--    <bean id="user" class="com.depressiom.pojo.User">-->
<!--        <constructor-arg type="java.lang.String" value="type"/>-->
<!--    </bean>-->
    <!--  第三种,直接通过参数名设置  -->
    <bean id="user" class="com.depressiom.pojo.User">
        <constructor-arg name="name" value="type"/>
    </bean>

在配置文件加载的时候,容器中管理的对象就已经初始化了

hello 加了一个无参构造,当取出user时加载配置,hello已经被初始化了

初始化

Spring配置说明

别名

<!--  如果添加了别名,可以通过别名获取对象  -->
    <alias name="user" alias="hello"/>

Bean的配置

<!--  Bean的配置
        id:bean的唯一标识符,相当于pojo的对象名
        class:bean对象对应的全限定名:包名+类型
        name:取别名,而且name可以同时取多个名字
      -->
    <bean id="user" class="com.depressiom.pojo.User" name="user2,u2">
        <constructor-arg name="name" value="type"/>
    </bean>

import

一般用于团队开发使用,可以将多个配置文件,导入合并一个。

<?xml version="1.0" encoding="UTF8"?>
<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">

        <import resource="beans.xml"/>
</beans>

依赖注入

构造器注入

上诉例子存在构造器注入

set注入

  • 依赖注入:Set注入
    • 依赖:bean对象的创建依赖于容器
    • 注入:bean对象中的所有属性,由容器来注入
package com.depressiom.pojo;

import lombok.Data;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
 * @ClassName Student
 * @Description 学生类
 * @Date 2022/12/5
 * @Author depressiom
 */
@Data
public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    private Properties info;
    private String email;

}

<?xml version="1.0" encoding="UTF8"?>
<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">

    <bean id="address" class="com.depressiom.pojo.Address">
        <property name="address" value="北京天通苑"/>
    </bean>
    <bean id="student" class="com.depressiom.pojo.Student">
        <!--   第一种,普通值注入,value     -->
        <property name="name" value="小明"/>
        <!--   第二种,bean注入,ref     -->
        <property name="address" ref="address"/>
        <!--   第三种,array注入     -->
        <property name="books">
            <array>
                <value>红楼梦</value>
                <value>西游记</value>
                <value>水浒传</value>
                <value>三国演义</value>
            </array>
        </property>
        <!--   第四种,list注入     -->
        <property name="hobbys">
            <list>
                <value>music</value>
                <value>ball</value>
                <value>game</value>
            </list>
        </property>
        <!--   第五种,Map注入     -->
        <property name="card">
            <map>
                <entry key="身份证" value="599321199611237769"/>
                <entry key="银行卡" value="622222344657995"/>
            </map>
        </property>
        <!--   第六种,Set注入     -->
        <property name="games">
            <set>
                <value>LOL</value>
                <value>DNF</value>
                <value>BOB</value>
            </set>
        </property>
        <!--   第七种,Properties注入     -->
        <property name="info">
            <props>
                <prop key="性别">男</prop>
                <prop key="年龄">16</prop>
            </props>
        </property>
        <!--   第八种,null注入     -->
<!--        <property name="email" value=""/>-->
        <property name="email">
            <null/>
        </property>
    </bean>
</beans>

beans

其他注入

<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="john-classic" class="com.example.Person">
        <property name="name" value="John Doe"/>
        <property name="spouse" ref="jane"/>
    </bean>

    <bean name="john-modern"
        class="com.example.Person"
        p:name="John Doe"
        p:spouse-ref="jane"/>

    <bean name="jane" class="com.example.Person">
        <property name="name" value="Jane Doe"/>
    </bean>
</beans>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="beanTwo" class="x.y.ThingTwo"/>
    <bean id="beanThree" class="x.y.ThingThree"/>

    <!-- traditional declaration with optional argument names -->
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg name="thingTwo" ref="beanTwo"/>
        <constructor-arg name="thingThree" ref="beanThree"/>
        <constructor-arg name="email" value="[email protected]"/>
    </bean>

    <!-- c-namespace declaration with argument names -->
    <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
        c:thingThree-ref="beanThree" c:email="[email protected]"/>

</beans>

bean作用域

  • 单例模式(默认) Singleton
  • 原型模式:每次从容器get的时候,都会产生一个新对象prototype

Bean的自动装配

是Spring满足bean依赖的一种方式
Spring中有三种装配的方式

  • 在xml中显示的配置
  • 在java中显示配置
  • 隐式的自动装配
 <!--
    byName:会自动在容器上下文查找,和对象set方法后面的值对应的bean id
    byType:会自动在容器上下文查找,和对象属性类型相同的bean id 
    -->
    <bean id="student" class="com.depressiom.pojo.Student" autowire="byType">

byName需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致
byType需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

使用注解实现自动装配

使用注解须知

  • 导入约束
xmlns:context="http://www.springframework.org/schema/context"
  • 配置注解的支持
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>

Autowired

  • 直接在属性上即可!也可以在set方法上使用
  • 使用Autowired,可以不用编写set方法,前提是这个自动装配的属性在IOC(Spring)容器中存在,并且符合名字byName

@Nullable 字段标记了这个注解,说明这个字段可以为null

如果Autowired的环境比较复杂,可以使用@Qualifier(value="XXX")指定装配

@Resource注解

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Resource(name="myMovieFinder") 
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

标签:--,Spring,private,bean,import,注入
From: https://www.cnblogs.com/depressiom/p/16945294.html

相关文章

  • 源码解析:Dubbo3 的 Spring 适配原理与初始化流程
    Dubbo国内影响力最大的开源框架之一,非常适合构建大规模微服务集群的,提供开发框架、高性能通信、丰富服务治理等能力。同时Dubbo无缝支持Spring、SpringBoot模式的开......
  • Spring Cloud Vault Config
    9.自定义要公开为属性源的机密后端SpringCloudVault使用基于属性的配置来创建键值和发现的秘密后端。​​PropertySource​​发现的后端提供bean来描述使用机密后端的......
  • Spring中获取request的几种方法,及其线程安全性分析
    前言本文将介绍在SpringMVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性。目录概述如何测试线程安全性方法1:Controller中加参数方法2:自动注入方法3......
  • 如何使用 Spring Cloud Zookeeper 进行服务发现和分布式配置
    该项目通过以下方式为SpringBoot应用程序提供Zookeeper集成自动配置并绑定到Spring环境和其他Spring编程模型习语。通过一些注释,您可以快速启用和配置常见模式......
  • springmvc注册fastJson报错
    原因:依赖版本问题这是我原本引入的依赖,版本是1.2.24<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId......
  • spring-boot-@Valid和@Validated详解
    ----------------------------------------------------------------------------------------在实际的项目开发中,经常会遇到对参数进行校验的场景,最常见的就是后端需要对......
  • spring学习小结之:hibernatetemplate,过度封装?
    边学spring,突然发现之前spring与hibernate结合的方式可以更厉害地封装,那就是用hibernateTemplate了,只需要改边userdao.java如下importorg.springfr......
  • spring mvc3及mvc 3.2中的异常处理小结
    在springmvc3中,处理异常的是试用exceptionresolver去做异常,先来个简单DEMO看下:1)自定义异常类publicclassSpringExceptionextendsRuntime......
  • Spring中配合hibernate使用的简单例子
    最近在看SPRING和hibernate,学习了spring和hibernate之间整合,下面举出一个例子予以说明.    首先,可以注入的是sessionfactory,因为sessionfactory的Datasource可以......
  • spring 3 jdbc常用小结
    spring3的jdbc跟springmvc搭配起来挺好用的,本文试着小结其主要使用方法,并举出spring3.3.2中的一些信变化进行解析1)在dao中注入jdbctemplate,然后......