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 }