Spring的理解

Spring是什么?

  1. spring核心:IOC(DI)控制反转+AOP面向切面编程
  2. spring功能: spring中可以使用Java注解以及XML文件对容器内的bean对象进行组合实现复杂功能;spring可以很好的整合其他开源框架以及类库。
  3. DI:在没有spring以前,我们需要一个类似的bean对象,需要自己主动创建,而现在只需要提出这样的一个需求,springIOC就会通过配置文件为我们注入该……(依赖spring的IOC容器给我们注入)
  4. spring是为了简化企业级应用而生的开源容器框架,特点:非倾入性、IOC、AOP、容器、一站式框架(在AOP|IOC基础上整合其他框架)

spring的实现

  1. 导入spring的核心jar包(eclipse开发最好装上spring插件便于开发)并且创建applicationContext.xml.
  2. 配置bean(基于xml文件、注解2种形式)

    1. bean实例的获取方式:通过全类名(反射)、通过工厂方法(静态记忆动态)、通过factorybean
    2. 通过工厂方法获取bean
      1. 实例工厂方法(在创建相应的bean之前先创建工厂实例):
        public class StaticCarFactory {
        private Map<String ,Car> cars=null;
        public StaticCarFactory (){
        cars=new HashMap<String,Car>();
        cars.put("01", new Car());
        Car car1=new Car();
        car1.setMaxSpeed(10000);
        car1.setName("dadawww");
        cars.put("02", car1);
        }
        public Car getCar(String key){
        return cars.get(key);
        }
        }

        配置工厂实例
        <bean id="staticCarFactory" class="com.wjy.spring.beans.auto.StaticCarFactory">
        </bean>
        配置bean实例,指定工厂及方法以及念书
        <bean id="carx" factory-bean="staticCarFactory" factory-method="getCar">
        <constructor-arg value="02"></constructor-arg>
        </bean>
      2. 静态工厂方法:为需要创建bean实例的类创建一个静态工厂类,直接通过该工厂类的静态方法就可以返回bean的实例
        public class StaticCarFactory {
        private static Map<String ,Car> cars=new HashMap<String,Car>();
        static{
        cars.put("01", new Car());
        Car car1=new Car();
        car1.setMaxSpeed(10000);
        car1.setName("dada");
        cars.put("02", car1);
        }
        public static Car getCar(String key){
        return cars.get(key);
        }
        }

        配置额类指向工厂类,并且指定工厂方法,以及相应的参数
        <bean id="carx" class="com.wjy.spring.beans.auto.StaticCarFactory" factory-method="getCar">
        <constructor-arg value="key"></constructor-arg>
        </bean>
    3. 反射获取bean的相关配置【导入类库、创建好对应的bean类,配置XML文件,即可通过一下方式直接获取bean实例】:
      反射方式配置bean:class属性:通过反射创建对象,id属性:我们可以通过id属性来调用该bean
      <bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
      </bean>

      获取bean:
      1、创建IOC容器
      // ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“applicationContext.xml”);
      2、从IOC容器获取bean实例
      // HelloWorld helloWorld=(HelloWorld) applicationContext.getBean(“helloWorld”);
      /*该方法获取bean要求容器中只有一个该类型的bean对象
      HelloWorld helloWorld=(HelloWorld) applicationContext.getBean(helloWorld.class);
      */
      3、调用bean的方法
      // helloWorld.hello();
  3. 为bean配置属性:set方法(需要相应的set方法)、构造方法(需要相应的构造方法)

    1. set方法:name属性标识bean对应的属性名称、value属性进行赋值(若包含特殊字符可以使用<![CDATA[]]>包装起来使用)
      <bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
      <!-- 为属性赋值 -->
      <property name="name" value="Jerry"></property>
      <property name="name">
      <value><![CDATA[<shanghai>]]></value>
      </property>
      </bean>

      bean的成员变量为引用类型
      <bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
      <property name="car" ref="car2"></property>
      </bean>

      <bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
      <property name="car"><ref bean="car2"/></property>
      </bean>

      <bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
      添加一个内部bean(内部bean外面不能引用)
      <property name="car">
      <bean id="car" class="com.atguigu.spring.helloworld.Car">
      <constructor-arg value="KUGA" index="1"></constructor-arg>
      <constructor-arg value="ChangAnFord" index="0"></constructor-arg>
      <constructor-arg value="250000" type="float"></constructor-arg>
      </bean>
      </property>
      </bean>

      为级联属性赋值(属性需要先初始化后再为级联属性赋值,否则有异常)
      <bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
      <property name="car" ref="car2"></property>
      <property name="car.name" value="aodi"></property>
      </bean>

      bean中含有集合属
      <bean id="user" class="com.atguigu.spring.helloworld.User">
      <property name="userName" value="Jack"></property>
      <property name="cars">
      <!-- 使用 list 元素来装配集合属性 -->
      <list>
      <ref bean="car"/>
      <ref bean="car2"/>
      </list>
      </property>
      </bean>

      <!-- 声明集合类型的 bean -->(需要导入util命名空间)
      <util:list id="cars">
      <ref bean="car"/>
      <ref bean="car2"/>
      </util:list>
      <bean id="user2" class="com.atguigu.spring.helloworld.User">
      <property name="userName" value="Rose"></property>
      <!-- 引用外部声明的 list -->
      <property name="cars" ref="cars"></property>
      </bean>

      MAP集合
      <bean id="user" class="com.atguigu.spring.helloworld.User">
      <property name="userName" value="Jack"></property>
      <property name="cars">
      <!-- 使用 list 元素来装配集合属性 -->
      <map>
      <entry key="AA" value-ref="car1"></entry>
      <entry key="BB" value-ref="car2"></entry>
      </map>
      </property>
      </bean>

      外部map
      <util:map id="cars">
      <entry key="AA" value-ref="car1"></entry>
      <entry key="BB" value-ref="car2"></entry>
      </util:map>

      配置properties(properties是HashTable【实现了Map接口】的子类)
      <bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
      <property name="properties">
      <props>
      <prop key="user">root</prop>
      <prop key="user">root</prop>
      <prop key="user">root</prop>
      <prop key="user">root</prop>
      </props>
      </property>
      </bean>

      使用p命名空间配置bean的属性(需要先导入P命名空间)
      <bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld" p:name="weijiayu" p:cars-ref="cars">
      </bean>

      Xml文件中的自动装配通过autowire属性实现(通过bean的name【id属性】与相应bean对象的属性名相同 或者type进行自动装配)【自动装配很少使用】
      <bean id="address1" class="com.wjy.spring.beans.auto.Address" autowire="byName"></bean>
      <bean id="address1" class="com.wjy.spring.beans.auto.Address" autowire="byType"></bean>
  4. bean的作用域(默认情况下在IOC容器的生命周期下只会为同一个bean节点产生一个bean对象)

    1. 使用bean的scope属性,可以从IOC容器重新创建一个新的bean对象给我们
      1. singleton:默认值,容器初始时就创建bean,并且只会产生一个bean实例(单例)
      2. prototype:原型的,在每次请求时会创建一个bean实例(多例)
  5. 配置IOC容器中bean与bean之间的关系(继承与依赖)
    1. 依赖(当要求配置一个bean时必须有一个关联的bean,即当前bean依赖于另一个bean)depends-on属性实现,若依赖多个bean可通过,隔开
      <bean id="car" p:maxSpeed="1002" parent="car1" depends-on="person">
    2. 继承(bean中的id属性是不会被继承的,若在子bean配置了相应属性,则会覆盖父bean的配置)
      <bean id="car1" class="com.wjy.spring.beans.Car">
      <property name="name" value="aodi"></property>
      <property name="maxSpeed" value="100"></property>
      </bean>
      <bean id="car" p:maxSpeed="1002" parent="car1"></bean>

      我们可以配置一个模板bean(同时可以通过abstract属性抽象它让它不能产生实例,只作为模板使用)
      <bean id="car1" class="com.wjy.spring.beans.Car" abstract="true">
      <property name="name" value="aodi"></property>
      <property name="maxSpeed" value="100"></property>
      </bean>
  6. bean的生命周期,类似于servlet,IOC容器可以对bean生命周期进行细致操作
    1. 通过构造器或者beanFactory创建bean
    2. 为bean的属性赋值初始化
    3. 容器关闭shi调用bean的销毁方法
    4. 在bean中设置init-method,destory-method,可以指定bean的初始化以及销毁方法(需要在bean对应的类中创建以对应属性值为名称的方法)
      <bean id="hehe" class="^^^^" init-method="init1" destory-method="destory1">
      </bean>
    5. bean的后置处理器可以对bean初始化前后对IOC容器内所有的bean做一定的处理
      1. 创建一个继承自BeanPostProcess接口的实现类,并在配置文件中配置该实现类对应额bean(postProcessAfterInitialization需要将其获得额bean参数返回,当然你也可以自己创建一个对象进行返回来个偷梁换柱)
        <bean class="com.wjy.spring.beans.auto.MyBeanPostProcess">
        </bean>
  7. 基于注解额方式配置bean

    1. spring能够从classpath路径下自动扫描带有特定注解的组件【@component标识了一个受spring管理的组件\@respsitory标识持久层组件\@controller标识表现层组件\@service标识业务层组件】对于扫描到到的组件,spring采用默认的命名策略,也可以通过注解的value属性值来进行标识
    2. 添加完注解还需要在配置文件中进行一定配置(需要在文件头导入context命名空间)
      <context:component-scan base-package="com.atguigu.spring.annotation.hehe"></context:component-scan>
    3. context:component-scan元素会自动注册autowiredAnnotationBeanPostProcessor后置处理器实例,该实例可以通过【@autowired\@resource\@inject】注解自动装配当前bean所依赖的bean(在配置文件中已经配置了该类型的bean,或者注解为@autowired(required=”false”),若容器内包含多个该类型的bean,spring会根据自己的规则去选择和(需要实例)属性名称一致的id的bean,若不存在则显示不是唯一的bean,则需要指定@qualifier(“beanID”))
    4. 使用注解配置bean、使用注解配置bean的属性
    5. spring的泛型依赖注入
    6. spring可以使用注解完全取代XML配置文件
  8. IOC容器:beanFactory、applicationContext
    1、创建Spring的IOC容器对象(在创建容器时默认情况下spring会调用构造器对在配置文件中配置的bean进行创建初始化并且调用set方法对配置的属性进行赋值,但若修改bean的scope属性,容器则会新建一个bean对象给我们而不是在容器创建时就初始化bean)
    2、spring提供了2种实现IOC容器的方式,一种是通过applicationContext接口(面向用户),另一种则是通过beanFactory实现(该实现面向spring框架本身)
    3、configurableApplicationContext接口则实现了对applicationContext的扩展,可以对bean的生命周期进行控制
    4、webapplicationContext则是专门为web应用扩展的接口

使用外部文件 ##

  • 在配置文件中bean时,有时需要将系统部署相关信息也配置到引入到该文件中,这时如果直接将信息配置到文件中可能会对后续维护上不利影响,这时就可以通过beanFactory后置处理器将部分配置信息外移到属性文件当中,而在 bean中可以通过类似EL的方式${var}来访问这些信息。
    导入外部文件
    <context:property-placeholder location="文件地址">
    <bean id="dataSource" class="^^^^^^^^^^^^^">
    <!--使用外部文件属性-->
    <property name="user" value="${user}"></property>
    <property name="user" value="${user}"></property>
    </bean>

    pinke中导入外部文件的案例
    <!-- 指定数据库配置信息 -->
    <bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <list>
    <value>classpath:c3p0.properties</value>
    <value>classpath:jdbc.properties</value>
    <value>classpath:conf.properties</value>
    </list>
    </property>
    </bean>

AOP与动态代理

  • 切面:aspect,横切关注点(跨越应用程序多个模块的)被特殊模块化的对象
  • 通知:advice,切面需要完成额工作
  • 目标:target,被通知的对象
  • 代理:proxy。想目标对象通知之后创建的对象
  • 链接点:jionpoint,程序执行的某个特定位置

总结spring
理清楚,JDBC,数据源,mybaties之间的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值