导图社区 JavaEE开源框架Spring编程教程
本图是JavaEE开源框架Spring编程教程知识的总结,一张图带你完全了解相关内容,帮你提高效率,赶紧来试一试吧~
编辑于2023-02-19 17:02:56 广东JavaEE开源框架Spring编程教程
spring定义
Spring是一个轻量级JavaEE开源框架
IOC/DI(控制反转/依赖注入)
1、控制反转/依赖注入:在service实现中声明dao接口或在action中声明service接口 生成setter getter 方法之后, 具体的实现类在spring.xml(anntoation: @Component("talentDao") 接口实现id,@Resource(name="talentDao")接口实现注入到接口中)中配置, 具体的实现就会自动注入到set方法中,这种方式的注入叫做依赖注入(setter注入,构造注入,接口注入),而这种控制权由spring容器来管理(而以前是由我们主动new出来的)。 这种把控制权交给spring容器来容管理的形式叫做控制反转; 2、通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦 3、有关反射的概念和用法,大家应该都很清楚,通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象 4、我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义, 然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。 从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。 5、为了解决对象之间的耦合度过高的问题
AOP面向切面编程
日志、事务(HibernateTransactionManager利用AOP进行事务处理)、异常处理、权限、安全统计、性能控制 目的是将业务代码与日志代码相分离,实现低偶合
代理类实现类InvocationHandler{ public void invoke(Object o, Method m) { long start = System.currentTimeMillis(); System.out.println("starttime:" + start); System.out.println(o.getClass().getName()); m.invoke(target); long end = System.currentTimeMillis(); System.out.println("time:" + (end-start)); } public class Client { public static void main(String[] args) throws Exception { Tank t = new Tank(); InvocationHandler h = new TimeHandler(t); Moveable m = (Moveable)Proxy.newProxyInstance((classCload,被代理接口,代理类)Moveable.class, h); m.move(); } }
一、配置xml实现方式 二、annation注解实现
<!-- 数据源 --><!-- <bean id="dataSourse" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> --> <!-- 数据库连接属性 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:jdbc.properties</value> </property> </bean> <!-- 数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- serviceImpl中 setDaop写 @Resource(name="userDao") 相当于<s:properyt ref="u"> set(daoimpl)注入 <bean id="userService" class="com.service.impl.UserServiceImpl" scope="prototype"> <property name="userDao" ref="u" /> </bean> --> <context:annotation-config /> <!-- <bean id="userDao" class="com.dao.impl.UserDaoImpl"> </bean> 代替此标签 表示在com包中查询 com.dao.impl.UserDaoImpl 中设置@Component("userDao") 相当于 id=userDao 在com包下搜索 注解标签 --> <context:component-scan base-package="com"/> <!--<bean id="userService" class="com.service.impl.UserServiceImpl"></bean> 用userServiceImpl中@Component("userDao")来替代--> <!-- 容器启动时 需要产生代理 自动产生代理 autoproxy注解行式 面向切面编程 --> <!--<aop:aspectj-autoproxy/> --> <!-- 初始化LogInterceptor 类--> <bean id="logInterceptor" class="com.aop.LogInterceptor"></bean> <aop:config> <!-- 切点 将切面方法 统一由切点来管理 --> <aop:pointcut id="daoPointCut" expression="execution(public * com.dao..*.*(..))" /> <!-- 引用 com.aop.LogInterceptor类 id--> <aop:aspect id="logId" ref="logInterceptor"> <!--在befor方法之后执行daoPointCut对应的 execution(public * com.dao..*.*(..)) --> <!--<aop:before method="befor" pointcut-ref="daoPointCut"/> --> <aop:before method="befor" pointcut="execution(public * com.dao..*.*(..))"/> <aop:after-returning method="after" pointcut-ref="daoPointCut"/> </aop:aspect> </aop:config> </beans>
//切面 @Aspect public class LogInterceptor { public void myMethod(){} public void befor(){ System.out.println("@Before"); } public void after(){ System.out.println("@AfterReturning"); } public void exceptions(){ System.out.println("@AfterThrowing"); } }
spring框架类型
Core(IOC/DI)核心框架
AOP Spring AOP Aspectj集成
Dao Spring jdbc事务管理
ORM Spring (hibernate Ibatis JPA)
web Spring (struts Webwork JSF)
J2ee 服务集成 (EJB JMS RMI JavaMail)
spring MVC 采用MVC模式web框架
beanFactory与ApplicationContext区别:
建议使用ApplicationContext实现了BeanFactory接口建立在它的基础之上的