day38 10-Spring的Bean的属性的注入

后处理bean,如果是返回bean,那么什么都不做直接把这个类原封不动地给你返回回去。

在它执行一些逻辑方法的时候对它进行逻辑增强,比如说进行时间监控,权限管理,日志的记录等等。

要做肯定是对正常的类增强才可以,因为正常你就调用这个类的add或者find()方法了。

增强的方法:继承、装饰者模式、动态代理。

装饰者的缺点是:如果你的接口中的方法太多,而你只需要增强其中的某一个方法,那你这个类里面就得写特别特别多的方法。而且其他的方法都是原封不动地给人家返回的。

动态代理:最灵活。对这个类生成一个代理类,Proxy.newProxyInstance()对bean这个类生成一个代理类。

public Object postProcessAfterInitialization(final Object bean, String beanName){

//不是对所有的类都增强,如果想对所有的类都增强,在这里生成代理类即可。

//调用业务的任何一个方法都相当于执行InvocationHandler的invoke()方法

}

其实Spring AOP的思想的有一部分是基于后处理bean。


package cn.itcast.spring3.demo5;

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

public class SpringTest5 {

    @Test
    public void demo5(){//Spring注入属性的两种方式:一种是构造器的注入
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    Car car = (Car) applicationContext.getBean("car");
    System.out.println(car);

    }
    @Test
    public void demo6(){//还有一种是setter方法的注入
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Car2 car2 = (Car2) applicationContext.getBean("car2");
        System.out.println(car2);

    }

}
package cn.itcast.spring3.demo5;

public class Car2 {
  private String name;
  private String price;
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getPrice() {
    return price;
}
public void setPrice(String price) {
    this.price = price;
}
@Override
public String toString() {
    return "Car2 [name=" + name + ", price=" + price + "]";
}

}
package cn.itcast.spring3.demo5;

public class Car {
     private String name;
     private Double price;

    public Car() {
        super();

    }

    public Car(String name, Double price) {
        super();
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car [name=" + name + ", price=" + price + "]";
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 别去schema,schema是文件,本地的文件,你得引那个头 -->

<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.xsd">
<!-- demo1快速入门================================================= -->
<!-- 把接口和实现类在这个配置文件中配置,有了实现类的全路径之后到时候才能用工厂反射 -->

   <!-- 通过一个<bean>标签来设置类的信息,通过id属性为类起个标识. -->
    <!-- 接口,实现类,配置文件也都有了 -->
    <!-- 现在有一个工厂Spring为我们提供好了,其实就是解析这个XML文件 -->
    <!-- 这个工厂你自己写会不会写?你用dom4j找里面的bean标签,找到class的属性值,然后就可以Class.forName()反射生成类的实例.其实Spring
         也是这么做的,只不过工厂由Spring提供好了
     -->
    <bean id="helloService" class="cn.itcast.spring3.demo1.HelloServiceImpl">
         <!-- 使用<property>标签注入属性
         value指的是普通值
         ref指的是对象
         -->
    <property name="info"  value="传智播客"></property>
    </bean>
    <!-- demo1快速入门 -->
    <!-- demo2Bean的实例化 -->
    <!-- 默认情况下使用的就是无参数的构造方法. -->
    <!--
    <bean id="bean1" class="cn.itcast.spring3.demo2.Bean1"></bean>
    -->
    <!--
    <bean name="bean1" class="cn.itcast.spring3.demo2.Bean1"></bean>
    -->
    <!-- 第二种使用静态工厂实例化 不能写class了,因为现在不是由Spring直接帮你创建对象了-->
    <!--
    <bean id="bean2" class="cn.itcast.spring3.demo2.Bean2Factory" factory-method="getBean2"></bean>
    -->
    <!-- 第三种使用实例工厂实例化 -->
    <!--
    <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
    -->
    <!-- 要先把Bean3Factory实例化 -->
    <!--
    <bean id="bean3Factory" class="cn.itcast.spring3.demo2.Bean3Factory"></bean>
    -->
    <!-- demo2Bean的实例化======================  end-->

    <!-- demo3Bean的作用范围======================= -->
    <!--
    <bean id="customer" class="cn.itcast.spring3.demo3.Customer" scope="prototype"></bean>
    -->
    <!--
    <bean id="product" class="cn.itcast.spring3.demo3.Product" init-method="setup" destroy-method="teardown" scope="singleton">
       <property name="name" value="空调">-->
       <!-- 把Product类的属性name注入进来 -->
       <!--
       </property>
    </bean>
 -->

       <!-- demo4Bean的生命周期======================= -->
       <bean id="customerService" class="cn.itcast.spring3.demo4.CustomerServiceImpl" init-method="setup"  destroy-method="teardown">

          <property name="name" value="itcast"></property>
       </bean>
       <!-- 后处理Bean是由Spring容器自动调用不用你管,我们起个id是为了我们在程序中去获得它。但是这个类不用由我们获得, 由Spring自动调用。cn.itcast.spring3.demo4.MyBeanPostProcessor是后处理Bean-->
        <bean class="cn.itcast.spring3.demo4.MyBeanPostProcessor"></bean>
       <!-- demo5Bean的属性注入=====================================================================================================================================-->
       <!-- 构造方法的注入 -->
       <bean id="car" class="cn.itcast.spring3.demo5.Car">
       <!--
        <constructor-arg name="name" value="宝马"></constructor-arg>
        -->
        <!-- 通过这个标签为类注入属性 -->
        <!--
        <constructor-arg name="price" value="1000000"></constructor-arg>
        -->
        <!-- 通过这个标签为类注入属性 -->
        <constructor-arg index="0" type="java.lang.String" value="奔驰"></constructor-arg><!-- 通过这个标签为类注入属性 -->
        <constructor-arg index="1" type="java.lang.Double" value="2000000"></constructor-arg><!-- 通过这个标签为类注入属性 -->

       </bean>

       <bean id="car2" class="cn.itcast.spring3.demo5.Car2">
       <!-- <property>标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象 -->
       <property name="name" value="保时捷"></property>
       <property name="price" value="5000000"></property>
       </bean>

</beans>
时间: 2024-10-28 16:03:04

day38 10-Spring的Bean的属性的注入的相关文章

day38 13-Spring的Bean的属性的注入:SpEL注入

Spring2.5提供了名称空间p注入属性的方式,Spring3.几提供了SpEL属性注入的方式. <?xml version="1.0" encoding="UTF-8"?> <!-- 别去schema,schema是文件,本地的文件,你得引那个头 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://

Spring给bean初始化属性值

可以在Spring容器初始化bean的时候给bean的属性赋初始值,直接在property标签里设置即可 1 2 3 4 5 6 <bean name="user**" class="com.fz.entity.User" >     <property name="id" value="1"></property>     <property name="username&

03 Spring框架 bean的属性以及bean前处理和bean后处理

上一节我们给出了三个小demo,具体的流程是这样的: 1.首先在aplicationContext.xml中添加<bean id="自定义id" class="包名.类名">.(还有两种工厂配置) 2.其次写一个自定义类,里面只包含一个系统输出的show(). 3.使用 ApplicationContext hw=new classpathXmlApplicationContext("applicationContext.xml");

day38 12-Spring的Bean的属性的注入:名称空间p

xmlns="http://www.springframework.org/schema/beans"是默认的名称空间. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"是带名字的名称空间.

JAVA面试题:Spring中bean的生命周期

Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取共享资源所引发的数据不同步问题. 然而在spring中 可以设定每次从BeanFactory或Appl

Spring中bean用法(2):生命周期

一:基本流程 把一个bean纳入到Spring IoC容器之中,这个bean的生命周期就会交由容器进行管理 1.Bean的建立 由BeanFactory读取Bean定义文件,并生成各个实例. 2.Setter注入 执行Bean的属性依赖注入. 3.BeanNameAware的setBeanName() 如果Bean类实现了org.springframework.beans.factory.BeanNameAware接口,则执行其setBeanName()方法. 4.BeanFactoryAwar

Spring:Spring中bean的生命周期

Spring中,从BeanFactory或ApplicationContext取得的实例为Singleton(单例模式),就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取共享资源所引发的数据不同步问题. 然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并

Spring注解驱动开发--属性赋值

前言 在实际开发当中,Spring中bean的属性直接赋值用的不是太多,整理这方面的资料,做一个小结,以备后续更深入的学习. 通过配置文件的方式 以配置文件的方式启动spring容器时,可以使用property标签的value给bean的属性赋值,赋值的形式有以下几种: <--通过context:property-placeholder将properties文件中的值加载的环境变量中(properties中的属性值最终是以环境变量的形式存储的)><context:property-pla

activiti中实现TaskListener注入Spring的bean

一开始我写的bpmn中 然后在我的监听器中注入的Spring的bean为空,注入不进来. 像这样,tenderService为null 注入不了. 此时需要把bpmn中这样设置,sendDocumentStartListener是监听器的类名(在这里首字母要小写) 监听器里要这么写(注意要加上@Component注解) 此时就可以注入Spring的bean了 原文地址:https://www.cnblogs.com/lqtbk/p/11018475.html