IOC(控制反转):即创建调用者的实例不再由调用者完成,而是由spring容器完成,并注入给调用者。举例 A B 两个类 A类里面要用到B的对象 以前的做法都是直接new出来的 ,使用spring后直接由spring中依赖注入。
IOC实现方式有两种 DL(依赖查找) DI(依赖注入)
AOP(面向切面编程):是一种编程思想,应用开发场景(日志和事务管理)。
ApplicationContext 是在加载spring配置文件的时候就创建好对象,可以在类中加无参构造器中进行验证。BeanFactory 并不会在容器初始化时创建,而是在真正调用的时候才会创建(懒加载)。
动态工厂bean的实现在applicationContext中注入bean 写法是:<bean id=" " factory-bean=" " factory-method=" ">
静态工厂bean的实现在applicationContext中注入bean 写法是:<bean id=" " class=" " factory-method=" ">
bean后处理器是在容器初始化前后完成的。spel注入 例: value = #{mySchool.pname} 需要提供get方法。value = #{T(java.lang.Math).random()*50}
内部bean注入 去掉id属性 不能通过getBean获取到。bean可以抽象出来 通过parent =“”。父类bean 增加abstract = “TRUE” 防止被getBean获取 。
异类抽象Bean 不需要class属性 添加abstract = “true” 这样就不会去找对应的类。
为spring配置多个文件 可以在路径那里加 applicationContext-*.xml 或者定义多个 放入数组中。
基于DI的注解 @component("mySchool") @Autowired 域属性上加 通过byType方式注入 @Qualifier("mySchool") 通过ByName注入。 @Resource jdk6以上 的注解byType 。在spring的配置文件中加入 <context:component-scan base-package = "com.xxx.xxx"/> 遇到后缀是package 路径都是. 遇到后缀都是location 路径是/
JavaBean :@Configuration//表示当前类作为spring容器使用 @Bean(“xxx”)
AOP------------------------------------
1 //代理 2 package com.pff; 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 public class DoProxy { 8 public static void main(String[] args) { 9 Test(); 10 } 11 public static void Test() { 12 IsomeService someService = new SomeServiceImpl(); 13 IsomeService isomeService = (IsomeService) Proxy.newProxyInstance(someService.getClass().getClassLoader(), 14 someService.getClass().getInterfaces(), new InvocationHandler() { 15 16 @Override 17 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 18 SystemMethods.doTx(); 19 Object result = method.invoke(someService, args); 20 SystemMethods.doLog(); 21 return result; 22 } 23 }); 24 isomeService.doFirst(); 25 isomeService.doSecond(); 26 } 27 } 28 //接口 29 package com.pff; 30 31 public interface IsomeService { 32 void doFirst(); 33 void doSecond(); 34 } 35 //实现类 36 package com.pff; 37 38 public class SomeServiceImpl implements IsomeService { 39 40 @Override 41 public void doFirst() { 42 System.out.println("执行DoFirst方法"); 43 } 44 45 @Override 46 public void doSecond() { 47 System.out.println("执行DoSecond方法"); 48 } 49 50 } 51 //织入方法 52 package com.pff; 53 54 public class SomeServiceImpl implements IsomeService { 55 56 @Override 57 public void doFirst() { 58 System.out.println("执行DoFirst方法"); 59 } 60 61 @Override 62 public void doSecond() { 63 System.out.println("执行DoSecond方法"); 64 } 65 66 }
applicationContext中 有一个ProxyFactoryBean 注册动态代理
AOP 前置通知方法要实现MethodBeforeAdvise,后置通知方法要实现AfterReturningAdvice,环绕通知要实现MethodInterceptor,异常通知实现ThrowsAdvise
<!-- 注册自动代理生成器 -->地洞代理生成器
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<!-- 注册自动代理生成器 --> BeanName代理生成
<!-- 1)可以选择要增强的目标对象 -->
<!-- 2)切面可以是顾问,也可以是通知 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="someService"/>
<property name="interceptorNames" value="myAdvice"/>
</bean>
<!-- 注册Jdbc属性文件 -->
<!--
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"/>
</bean>
-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 注册数据源:C3P0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3366/test
jdbc.user=root
jdbc.password=123
//可以类似的抽方法
1 public class StudentRowMapper implements RowMapper<Student> { 2 3 // rs:不是select查询的所有结果集,而是这个结果集中当前遍历的这一行记录 4 @Override 5 public Student mapRow(ResultSet rs, int rowNum) throws SQLException { 6 Student student = new Student(); 7 student.setId(rs.getInt("id")); 8 student.setName(rs.getString("name")); 9 student.setAge(rs.getInt("age")); 10 return student; 11 } 12 13 }