Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。序言:
小伙伴们,spring框架大家应该不陌生吧,因为它基本适用java的任何一个项目,都会用到它,首先来说一下spring到底是什么呢,我的理解是spring是一个基于代理结构的管理框架,它不充当项目中mvc中的任何一个环节,但是它影响每一个环节,mvc任何一个环节受spring管理,而spring的存在大大节省了软件开发效率,也节约了软件开发成本,最重要的是它也降低了软件开发的门槛,让人人可以开发,也解密了软件的神秘面纱。
一.发展背景
Spring(由Rod Johnson创建的一个开源框架) 方法
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
当配置好此配置之后,当服务器被开启的时候,工厂也就启动了,而工厂中所有的bean也被创建了,接下来工厂等待开发人员来取就可以了。
<context:component-scan base-package="hanuser.*"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter> </context:component-scan>
其中<context:exclude-filter type="annotation" 。。。。>言外之意是排除带有Controller注解的包,它不被扫描。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> <property name="username" value="username"/> <property name="password" value="password"/> </bean>
③
<!-- 3.连接工厂,操作数据库的 --> 创建工厂bean,创建复杂对象时用的,例如:sqlSession, <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="typeAliasesPackage" value="hanuser/entity"></property> <property name="mapperLocations" value="classpath:config/*-map.xml"></property> </bean>
此配置的意思是:创建复杂对象时需要用到工厂bean,创建sqlSessonFactory,需要得到sqlSession,连接数据库。
其中第一个配置dataSource是数据连接,连接数据库的数据源,那是肯定必须的。
其他属性是附加的:
第二项:typeAliasesPackage的作用是提前指定实体的权限名,当再次使用实体类的时候,只需要使用类名即可(别名),并不需要再map文件中都要指定权限名。
第三个配置:mapLocations的作用
当mybatis的xml文件和mapper接口不在相同包下时,需要mapperLocations属性指定xml文件的路径,*是一个通配符,代表所有的文件
<!--4. 扫描Dao -->
<!-- 通过扫描的模式,扫描目录在hanuser.Dao目录下的Dao--> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="hanuser.Dao"></property> <property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"></property> </bean>
- byType:基于属性类型 自动注入
:在工厂中查找和属性同类型的bean,将bean注入给属性
:如果没有找到则不赋值,属性为null
:如果工厂中有多个bean都和属性同类型,则因无法选择抛出异常
- byName:基于属性名称 自动注入
:在工厂中查找ID和属性名相同的bean,将bean注入给属性
:如果没有找到则不赋值,属性为null
当在service中定义dao属性的时候,取bean的模式,注入值的方式就是注解byName的模式。
- bean的生产原理
反射:
<bean id=“xx”class=“com.xx.XX”></bean>
Spring读取到如上配置时,会生产该类的对象:
Class claz=Class.forName(“com.xx.XX”);
XX obj=(XX)claz.newInstance();
获得类对象,然后调用空参构造获得实例对象
- bean的创建模式
两种创建模式singleton/prototype
singleton:单例模式
spring工厂中只生产一次对应bean
: 即工厂中只有一份对应bean的对象
: 默认创建模式
- Prototype:原型模式(非单例模式)
:每次使用bean,spring工厂都会重新创建对象
有状态的bean需要原型模式,无状态的bean使用默认的单例模式即可
• bean的生命周期
如果使用spring生产复杂对象,就不可以直接new了,<bean id="xx" class="com.cn.XX">
这样使用id直接获取bean显然就不可以了,已经不适用了。
要想使用spring生产复杂对象必须找到复杂对象的工厂bean,用工厂bean生产复杂对象,而不直接通过工厂进行生产,间接的向工厂bean索要即可,例如:sqlSession对象,就不能直接进行生产,则需要通过SqlSessionFactory这样的工厂bean进行生产sqlsession。
aop:面向切面编程,相对于OOP的编程单位是class,aop的编程单位是切面(Aspect),aop基于代理框架功能,
代理结构:目标+额外功能
动态代理:
定制目标和额外功能 编织:将额外功能和目标组合成代理。
代理:目标+额外功能+切入点
切面:额外功能+切入点
关于spring的知识先介绍到这里。