简介
spring是一款开源的轻量级框架,开源说明公开源代码,轻量级说明依赖比较少,相比于框架EJB。框架结构如下:
ioc
ioc反转的功能是内核容器的功能,反转是相对与我们原来调用对象的方法来说的:(更为详尽的表述参考:blog.csdn.net/qq_22654611…
- 1.原来的时候使用对象方法,先new一个对象,再调用对象的方法。
- 2.ioc的实现是为了使对象直接,相互解耦。当一个对象需要调用另一个对象的方法得时候,就向底层容器发出请求,底层容器根据反射完成对象的生成。这就是反转。
- ioc的主要优点是解耦,有利于项目开发维护。
ioc的jar包
-
内核包
- spring-beans-4.2.4.RELEASE.jar
- spring-context-4.2.4.RELEASE.jar
- spring-core-4.2.4.RELEASE.jar
- spring-expression-4.2.4.RELEASE.jar 总结: spring的4个基本内核包,所有的spring包都需要这四个包 。
-
log包
- commons-logging-1.2.jar
- 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>
//通过普通的工厂方法。首先要创建工厂对象,
总结:对于有参构造器需要采用工厂方法
关键字
- id 对象名
- class Class对象的名字
- scope 范围:singleton单实例。多次get对象相同;prototype,蓝本多次get的对象不相同;session,针对web的对象创建后放到session的域中;request,对于web的,对象创前后放到request中。globalsession,session的全局。
- name 基本不用,为id相似,name中可以包含特殊字符#_等
属性注入
属性注入有两种:
- 有参构造器。 不常用。反射基本采用无参构造器
- set函数注入,通过bean实现
<bean id="person" class="com.zhao.classes.Person" >
<property name="name" value="zhaoshuyou"/>
<property name="age" value="12" />
</bean>
复杂对象
复杂对象注入:
- 数组。注入对象目前发现只能是基本类型
- list,同上
- map,可以有其他参考
- 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>-->
注解方式注入
- 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">
- 开启注解扫描
<context:component-scan base-package="com.zhao.day2"></context:component-scan>
- 注解的包。在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
-
需要注解的地方
- @ 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是切面编程,实现在不改变原来类的技术上,在原来的方法前后增加一些实现。实现原理是代理。
- 切入点:要增强方法
- 增强/通知:增加的方法
- 前置、后置、异常、最终、环绕、在方法前后执行
- 切面:增强用到切入点中。
- target:用增强的类
- 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>