spring简介 ioc aop

300 阅读5分钟

简介

spring是一款开源的轻量级框架,开源说明公开源代码,轻量级说明依赖比较少,相比于框架EJB。框架结构如下:

底层容器包含了:beans(bean标准的对象操作)、core(实现ioc)、context环境是基础、sqel。底层主要实现了IOC,控制反转功能。一些模块组件实现其他功能,数据jdbc的jdbcTemplate,web springmvc等。

ioc

ioc反转的功能是内核容器的功能,反转是相对与我们原来调用对象的方法来说的:(更为详尽的表述参考:blog.csdn.net/qq_22654611…

  • 1.原来的时候使用对象方法,先new一个对象,再调用对象的方法。
  • 2.ioc的实现是为了使对象直接,相互解耦。当一个对象需要调用另一个对象的方法得时候,就向底层容器发出请求,底层容器根据反射完成对象的生成。这就是反转。
  • ioc的主要优点是解耦,有利于项目开发维护。

ioc的jar包

  • 内核包

    1. spring-beans-4.2.4.RELEASE.jar
    2. spring-context-4.2.4.RELEASE.jar
    3. spring-core-4.2.4.RELEASE.jar
    4. spring-expression-4.2.4.RELEASE.jar 总结: spring的4个基本内核包,所有的spring包都需要这四个包 。
  • log包

    1. commons-logging-1.2.jar
    2. log4j-1.2.16.jar 总结log对应的包,中commons-logging是log的输出接口包,功能简单但是兼容底层,实现隔离。log4j包是功能强大的log包。 log4j包需要配置文件log4j.properties。内容如下,设置配置与打印信息。
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d:\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout****

ioc的xml的配置文件

xml文件的内容进入注入对象中,完成对象的创建。

  • 对象注入,通过空参的构造器
  • 对象注入,通过静态工厂方法
  • 对象注入,通过普通的工厂方法
    代码示例
    <bean id="user" class="com.zhao.classes.User">
    //普通注入,
    <bean id="user" class="com.zhao.classes.UserFactory"  factory-method="getUser"></bean>
    //通过com.zhao.classes.UserFactory中的静态方法getUser注入

    <bean id="factory"  class="com.zhao.classes.UserFactory2"></bean>
    <bean id="user" factory-bean="factory" factory-method="getUser"></bean>
    //通过普通的工厂方法。首先要创建工厂对象,


总结:对于有参构造器需要采用工厂方法

关键字

  1. id 对象名
  2. class Class对象的名字
  3. scope 范围:singleton单实例。多次get对象相同;prototype,蓝本多次get的对象不相同;session,针对web的对象创建后放到session的域中;request,对于web的,对象创前后放到request中。globalsession,session的全局。
  4. name 基本不用,为id相似,name中可以包含特殊字符#_等

属性注入

属性注入有两种:

  1. 有参构造器。 不常用。反射基本采用无参构造器
  2. set函数注入,通过bean实现
    <bean id="person" class="com.zhao.classes.Person"  >
        <property name="name"  value="zhaoshuyou"/>
        <property name="age"  value="12" />

    </bean>

复杂对象

复杂对象注入:

  1. 数组。注入对象目前发现只能是基本类型
  2. list,同上
  3. map,可以有其他参考
  4. properties 基本类型。
 <!--<bean id="user3"  class="com.zhao.classes.User3">-->
        <!--<property name="array1">-->
            <!--<list>-->
                <!--<value>zhao</value>-->
                <!--<value>shu</value>-->
                <!--<value>you</value>-->
            <!--</list>-->

        <!--</property>-->

        <!--<property name="list1">-->
            <!--<list>-->
                <!--<value type="java.lang.Integer">12</value>-->
                <!--<value type="java.lang.Integer">200</value>-->
                <!--<value type="java.lang.Integer">100</value>-->
            <!--</list>-->

        <!--</property>-->


        <!--<property name="map">-->
            <!--<map>-->
                <!--<entry key="a" value="1231"></entry>-->
                <!--<entry key="b" value="zhao"></entry>-->
                <!--<entry key="c" value="shu"></entry>-->
            <!--</map>-->
        <!--</property>-->


        <!--<property name="proterty">-->
            <!--<props>-->
                <!--<prop key="1">ma</prop>-->
                <!--<prop key="2">ruo</prop>-->
                <!--<prop key="3">juan</prop>-->
            <!--</props>-->
        <!--</property>-->

    <!--</bean>-->

注解方式注入

  1. xml的约束 context,beans
<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 http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  1. 开启注解扫描
   <context:component-scan base-package="com.zhao.day2"></context:component-scan>
  1. 注解的包。在ioc的技术上增加:spring-aop-4.2.4.RELEASE.jar
    1. spring-beans-4.2.4.RELEASE.jar
    2. spring-context-4.2.4.RELEASE.jar
    3. spring-core-4.2.4.RELEASE.jar
    4. spring-expression-4.2.4.RELEASE.jar
    5. commons-logging-1.2.jar
    6. log4j-1.2.16.jar
    7. spring-aop-4.2.4.RELEASE.jar
  1. 需要注解的地方

    • @ component(value="user")其中value可以省略。user代表对象的id。
    • service controller responsitory三个标签可以替代component对类进行标注
    • autowire 属性自动注解
    • @Resource(name=“”) 属性引用注解
@Component(value = "person")
@Scope(value = "prototype")
public class Person {

    @Resource(name="person22")
    private Person2 person2;

    public void  print(){
        System.out.println("hello person**************");
        person2.print();
        System.out.println(person2);
    }
}

aop

aop是切面编程,实现在不改变原来类的技术上,在原来的方法前后增加一些实现。实现原理是代理。

  1. 切入点:要增强方法
  2. 增强/通知:增加的方法
    • 前置、后置、异常、最终、环绕、在方法前后执行
  3. 切面:增强用到切入点中。
  4. target:用增强的类
  5. introduction;引进属性或者方法。这个一般用不到

jar包

在注解的基础上增加4个包

    1. spring-beans-4.2.4.RELEASE.jar
    2. spring-context-4.2.4.RELEASE.jar
    3. spring-core-4.2.4.RELEASE.jar
    4. spring-expression-4.2.4.RELEASE.jar
    5. commons-logging-1.2.jar
    6. log4j-1.2.16.jar
    7. spring-aop-4.2.4.RELEASE.jar
    8. aopalliance-1.0.jar
    9. aspectjweaver-1.8.7.jar
    10. spring-aop-4.2.4.RELEASE.jar 
    11. spring-aspects-4.2.4.RELEASE.jar

约束

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->

实现过程

    //一般的ioc注入
   <bean id="person3" class="com.zhao.day2.ioc.Person3"/>
    <bean id="aop"  class="com.zhao.day2.ioc.AOP"/>
    
    //配置切入点。
    <aop:config>
        <aop:pointcut id="cut1" expression="execution(* com.zhao.day2.ioc.Person3.print(..))"/>
        //配置切面
        <aop:aspect ref="aop">  //对象
            <aop:before method="before" pointcut-ref="cut1"/> 
            <aop:after method="after" pointcut-ref="cut1"/>
            <aop:around method="around" pointcut-ref="cut1"/>


        </aop:aspect>
    </aop:config>
    

注解aop