深入ssm框架1--bean与spring容器( spring管理bean 注册+装配 )

@参考网络 仅为学习笔记

深入ssm框架1--bean与spring容器(  spring管理bean 注册+装配  )

Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载、实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用

深入ssm框架1--bean与spring容器( spring管理bean 注册+装配 )_第1张图片

(1)spring容器会根据含有Bean配置的XML文件(spring.xml),把配置文件的Bean配置信息与spring容器中Bean定义注册表相对应起来;

(2)spring容器根据Bean注册表实例化Bean;

(3)通过Bean的实现类,把实例化过的Bean放到spring容器中的Bean缓存池中;

(4)某个模块要是使用的话,通过注解或者xml配置,让spring把Bean缓存池中的实例Bean注入到该模块当中;

1ApplicationContext.getBean(“id”);  Context = new 2ClassPathXmlApplicationContext(“配置文件xml”);

1接口读取配置文件 管理对象的加载生成维护bean对象之间的依赖关系负责bean的生命周期

2接口实现类 从classpath路径中读取配置文件 除此之外还有其它实现类fileSystemXmlApplicationContext  applicationContext其实是建立在beanFactory基础上的 beanFactory接口是spring ioc的核心 负责管理组件和它们之间的依赖关系 用用程序通过beanfactory 接口与ioc容器交互 applicationContext是beanFactory的子接口

1 Spring管理Bean两个部分  注册  1自动  2JavaConfig   3XML装配Bean  1依赖  2注解

Spring容器启动的三大要件分别是 bean定义信息 实现类 spring本身

xml配置

xml配置

默认命名空间

 xsi命名空间

自动注解  引入context命名空间

spring命名aop的命名空间 是用户自定义的

 

用于为每个文档中命名空间指定响应的schema

样式文件是标准组织定义的标准命名空间  1指定名称

2指定空间的schema文档样式文件的位置

用空格或回车换行进行分隔

 

 默认命名空间配置

定义对象信息与类信息是分离的

设值注入 而非直接为属性赋值  

通过调用bean的setter方法实现

xml声明 读取文档字符集

xmlns:xsi=”xsi标准命名空间指定自定义的scheme文件http://www.w3.org/2002/XMLSchema-instance”

xmlns:context=“http://www.springframework.org/schema/context”//自动注解  引入context命名空间

xmlns:aop=”命名空间全称必须在xsi命名空间为其指定空间对应scheme文件http://www.springframework.org/schema/aop”

xsi:schemaLocation=” http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd”

http://www.springframework.org/schema/context/spring-context-3.0.xsd”    >

 

   

 

        p:logDao-ref="logDao" p:userDao-ref="userDao"/>  

aop命名空间配置

采用xml方式定义信息与实现类是分离的     基于注解的配置方式时bean定义信息即通过在bean实现类上标注注解实现

使用注解配置信息启动spring容器            spring提供了一个context的命名空间 提供了通过扫描类以应用注解定义bean的方式   注解生效  xml配置显示指定  xml配置文件中使用context/////重写spring容器的context

自动配置

Component  == Repository+Service+Controller 

特殊注解 用途更清晰化 

@AutoWired注解去装配Bean

(所谓装配,就是管理对象直接的协作关系)

类上注解定义

bean定义信息通过bean实现类上标注注解实现 

context

这样此类对象只有一个???

扫描类包以用用注解定义的bean

???

import org.springframework.stereotype.Component/Repository;

@Component("userDao")public class UserDao {} //①通过Repository定义一个DAO的Bean

java config 

普通pojo类标注@Configuration  spring容器如何配置

(怎么去注册bean,怎么去处理bean之间的关系=装配)

类的方法可以标注bean注解 类型由方法返回值类型确定

名称默认同方法名

也可以通过入参显示指定的bean名称 @Bean(name=””)

@Bean意思,获取此bean时,spring按照此方式去帮获取

 在方法上,告诉Spring容器可以从下面这个方法中拿到一个Bean

每个标注了@bean的类方法都相当于提供了一个bean的定义信息  

 import org.springframework.context.annotation.Bean/ Configuration;

@Configuration  //①将一个POJO标注为定义Bean的配置类

public class AppConf {    //②以下两个方法定义了两个Bean,以提供了Bean的实例化逻辑

    @Bean    public UserDao userDao(){       return new UserDao();        }

    @Bean    public LogDao logDao(){        return new LogDao();    } //③定义了logonService的Bean

    @Bean    public LogonService logonService(){

        LogonService logonService = new LogonService();    //④将②和③处定义的Bean注入到LogonService Bean中

        logonService.setLogDao(logDao());  logonService.setUserDao(userDao());      return logonService;   }}

  

 传统的spring时xml配置的,Javaconfig 是指基于java配置的spring   spring3.0新增了许多Java config的注解 特别是springboot   

1@configuration配置类 注解该类 等价于xml配置beans 用@bean等价于xml中配置bean 被注解的类内部包含一个或多个被@bean注解的

2注解@Autowried @Qualifier(“beanid”)/直接引用;  /@Resource() private 类 beanid

3通过bean元素声明需要spring创建的实例 类型通过class属性指定 并通过id属性为该实例指定一个名称Property为属性赋值 bean引用可以用内部bean方式注入

基于java类的配置方式和基于xml或基于注解的配置方式相比 前置通过代码的方式更加灵活的实现了bean的实例化及bean之间的装配 但后面两者都是通过配置声明的当时 在灵活性上要稍逊一些但是配

装配

依赖注入

  属性注入setXxx()可选择性和灵活性高的优点 最常用 要求bean有默认构造函数 反射方式注入  

  构造函数注入  bean提供带参构造函数

  工厂方式注入  非静态工厂方法     carFactory" class="...CarFactory" /> factory-bean="carFactory" factory-method="createHongQiCar">

             很多工程类都是静态的   意味着用户无须创建工厂类实例的情况下就可以调用工厂类方法 调用更加方便

注解注入

注解注入  Autowired   默认按类型匹配,在容器查找匹配Bean,当有且仅有一个匹配的Bean时,将其注入

required即使找不到匹配的Bean也不用抛出异常,使用@Autowired(required=false)进行标注:  Qualifier限定注入bean名称    @Autowired  @Qualifier("userDao")  private UserDao userDao;

  对类成员变量及方法的入参进行标注 public void init(@Qualifier("userDao")UserDao userDao,LogDao logDao){

Spring还支持@Resource名称匹配也可属性方法 和@Inject注解(无required) 

 

参考:  https://www.cnblogs.com/bossen/p/5824067.html

 Bean与spring容器关系  https://www.cnblogs.com/rainwang/p/7568238.html

 

词组解释:

javabean   JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取  属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。

pojo 简单的Java对象,实际就是普通JavaBeans 

pojo=普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO,它不包含业务逻辑或持久逻辑

但是JavaBean则比 POJO复杂很多, Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范.

 

 

xsi   web.xml遵守xml规范 与dtd类似   

schema  对文档的限制   schemaLocation用于声明了目标名称空间的模式文档

命名空间:schemaLocation用于声明了目标名称空间的模式文档

命名 空间是用来组织和重用代码的。如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了。为了解决这个问题,引入了名字空间这个概念,通过使用 namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。
通常来说,命名空间是唯一识别的一套名字,这样当对象来自不同的地方但是名字相同的时候就不会含糊不清了。使用扩展标记语言的时候,XML的命名空间是所有元素类别和属性的集合。元素类别和属性的名字是可以通过唯一XML命名空间来唯一。
在XML里,任何元素类别或者属性因此分为两部分名字,一个是命名空间里的名字另一个是它的本地名。在XML里,命名空间通常是一个统一资源识别符(URI)的名字。而URI只当名字用。主要目的是为了避免名字的冲突。

 

 

 

你可能感兴趣的:(深入ssm框架1--bean与spring容器( spring管理bean 注册+装配 ))