https://docs.spring.io/spring/docs/5.1.1.RELEASE/spring-framework-reference/core.html#spring-corehtml
spring框架最重要的是ioc容器,接着是aop。而后是官方对spring的吹牛逼,这里就不翻译了。java
spring ioc 反射 核心:web
java.lang.Class
1,ioc框架spring
1,1 spring ioc框架和beans的介绍数据库
ioc,控制反转,也叫依赖注入{DI},定义一个过程所需的依赖项。org.springframework.beans
和 org.springframework.context是spring的基石。
BeanFactory
接口提供对任何类型对象的配置管理能力。ApplicationContext是beanFactory的子接口,提供了:
apache
集成aop特征;
api
消息资源处理tomcat
事件发布;安全
应用层上下文app
2, spring bean
通俗话说就是 根据java 反射机制,由spring ioc容器 根据对象名实例化对象。ioc中的bean,必须有无参构造
对象的实例化,须要关注对象的元数据一下3个信息
a,如何建立一个bean;
b,bean的生命周期的详细信息;
c,bean的依赖关系;
上述全部的配置元数据转换成一组构成每一个 bean 定义的下列属性。
属性 | 描述 |
---|---|
class | 这个属性是强制性的,而且指定用来建立 bean 的 bean 类。 |
name | 这个属性指定惟一的 bean 标识符。在基于 XML 的配置元数据中,你可使用 ID 和/或 name 属性来指定 bean 标识符。 |
scope | 这个属性指定由特定的 bean 定义建立的对象的做用域,它将会在 bean 做用域的章节中进行讨论。 |
constructor-arg | 它是用来注入依赖关系的,按照构造体方式赋值 |
properties | 它是用来注入依赖关系的,对象的属性。 |
autowiring mode | 它是用来注入依赖关系的,自动装配,只适用于ref |
lazy-initialization mode | 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去建立一个 bean 实例。 |
initialization 方法 | 在 bean 的全部必需的属性被容器设置以后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
destruction 方法 | 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
依赖注入内容能够是:property,ref, list,set,array
proerty value="",type=int;复制属性类型是int;
赋予null
<property name="name">
</null>
</property>
赋予""
<property name="name">
<value></value>
</property>
自动装配:autowire="byName|byType|byConstruct|no"
byName:
<bean id="course" class="xxx.xxx.xxx.course" autowire="byName">
</bean>
course类中有一个ref属性teacher(属性名),而且该ioc容器中刚好有一个bean的id名称同属性值,则自动装配该属性;
byName本质是byId
byType,自动寻找其它bean的类型是否与该类的属性类型一致;
byConstruct:其它bean的类型(class) 是否与 该Course类的构造方法参数 的类型一致:此种方式的本质就是ByType;
byName,byType,byConstruct容易形成混乱,大工程不建议用.
使用注解配置bean:
1,在类头部加注解,申明该类须要放入容器
@Component("studentDao")
2,在application.xml扫描对应包
<--配置扫描器-->
<context:component-scan base-pacakge="com.aaa.dao">
</context:component-scan>
spring在启动的时候,会根据base-pacakge在该包中扫描全部类,查找component,加入ioc容器中;
@Component细化:
dao层:@Repository
service层:@Service
控制器层:@Controller
repository,service,controler三个做用和component做用是同样的,只是为了显示这个类在哪一层.
使用注解实现事务(声明式事务)
目标:经过事务,事务要么全成功,要么全失败;
application.xml 配置事务管理器,增长对事务的支持
<bean id="txManager" class="Data"
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value=""></property> <property name="url" value=""></property> <property name="username" value=""></property> <property name="password" value=""></property> <property name="maxActive" value="1"></property> <property name="maxIdle" value="1"></property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--增长对事务的支持--> <tx:annotation-driven transaction-manager="transactionManager"/>
在处理数据库的dao函数前面,添加@Transaction;
事务:
只读事务:一次执行屡次查询来统计某些信息,这时为了保证数据总体的一致性,要用只读事务;
日志模块:
spring boot 自动继承log4j,引入maven spring boot自动引入log4j;
类引入日志例子:
private static Logger logger = LoggerFactory.getLogger(DemoApplication.class);
日志代码文件配置,配置位置:application.properties:
logging.file=logger.log
spring-web.jar在tomcat启动时,经过监听器把IOC容器启动,并把context传过去.
web.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
拆分配置多个applicationContext:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml, /WEB-INF/applicationContext_service.xml, /WEB-INF/applicationContext_controller.xml, /WEB-INF/applicationContext-*.xml,</param-value> </context-param>
spring 页面安全认证:
https://spring.io/guides/gs/securing-web/
http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/