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

@参考网络 仅为学习笔记

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

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

(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配置

<beans>默认命名空间

 xsi命名空间

自动注解  引入context命名空间

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

 

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

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

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

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

 

<bean id="" class=""> 默认命名空间配置

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

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

通过调用bean的setter方法实现

<?xml version=”1.0” encoding=”utf-8”?> xml声明 读取文档字符集

<beans xmlns=”默认命名空间http://www.springframework.org/schema/beans

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”    >

 

 <bean id="userDao" class="com.baobaotao.anno.UserDao"/>  <bean id="logDao" class="com.baobaotao.anno.LogDao"/>

 <bean id="logService" class="com.baobaotao.conf.LogonService"

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

<aop:config><aop:  ></aop:config> aop命名空间配置

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

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

自动配置

Component  == Repository+Service+Controller 

特殊注解 用途更清晰化 

@AutoWired注解去装配Bean

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

类上注解定义

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

context

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

<context:component-scan base-package=”com.baobaotao.anno”  resource_pattern=””/>

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

<bean class=”com.baobaotao.anno.LogonService”></beans>???

<context:include-filter type=”regex” expression=”com\.baobaotao\anno.*Service”/>

<context:exclude-filter type=”aspectj” expression=”com\.baobaotao..*Controller+”/>

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有默认构造函数 反射方式注入<property name=”” ref=””></property>   <property name=””><value>…</value></property>

  构造函数注入  bean提供带参构造函数<constructor ref=””></>

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

             很多工程类都是静态的   意味着用户无须创建工厂类实例的情况下就可以调用工厂类方法 调用更加方便<bean id="car6" class="...CarFactory"  factory-method="createCar"></bean>

注解注入

注解注入  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只当名字用。主要目的是为了避免名字的冲突。

 

 

 

猜你喜欢

转载自www.cnblogs.com/eileen78/p/11541259.html
今日推荐