第一步
加载Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
第二步
IOC容器去读取配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- MySQL数据库驱动 --> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <!-- 连接数据库的URL --> <property name="url" value="jdbc:mysql://localhost:3306/j210901?characterEncoding=utf8"/> <!-- 连接数据库的用户名 --> <property name="username" value="root"/> <!-- 连接数据库的密码 --> <property name="password" value="1234"/> </bean> <!-- 配置JDBC模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 控制层 --> <bean id="loginController" class="com.controller.LoginController"> <!-- property 标签 是做 类中的 属性注入 name对应类中的 属性名字,ref对应 id一致的bean --> <property name="loginService" ref="loginService"></property> </bean> <!-- 业务层 --> <bean id="loginService" class="com.service.imp.LoginServiceImp"> <!-- property 标签 是做 类中的 属性注入 --> <property name="loginDao" ref="loginDao"></property> </bean> <!-- 持久层 --> <bean id="loginDao" class="com.dao.imp.LoginDaoImp"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <!-- execution(): 表达式主体。 第一个*号:表示返回类型,*号表示所有的类型。 包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.hopu.service.impl包、子孙包下所有类的方法,*号表示所有的类。 *(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。 --> <bean id= "myAspect" class="com.aspect.MyAspect"> </bean> <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* com.service.imp.*.*(..))" id="pointcut"/> <aop:aspect id="myAspect" ref="myAspect"> <!-- method属性对应的是方法名字--> <aop:before method="before" pointcut-ref="pointcut"/> <aop:after method="before" pointcut-ref="pointcut"/> <aop:around method="aroundTest" pointcut-ref="pointcut"/> </aop:aspect> <!-- <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> --> </aop:config> </beans>
第三步
根据配置文件初始化 bean。
根据bean的class去读取对应的类,使用反射来把对应的类实现。
newInstance();
第四步
把实例化之后的对象,存入循环存入对应的容器之中。
接着把对应的属性注入进对应的bean的属性之中。
补充
中间使用了AOP,根据对应的配置执行了动态代理,把配置内容对应的类和方法交给了代理来管理。
第五步
调用对应的bean。
LoginController lc = (LoginController) ac.getBean("loginController");
第六步
拿到返回值。
System.out.println(lc.login());
补充
拿值的过程中中间被代理管理的部分,执行了代理这就是AOP的切面部分。