一、Spring 概述
spring是一个开源免费的框架,为解决企业应用开发的复杂性而创建的。轻量级(耦合性低)解决方案,模块化,非侵入式
二、Spring 的组成
1. Spring AOP :面向切面的管理
2. Spring ORM :管理 MyBatis(iBatis)
3. Spring DAO :也就是Spring的JDBC
4. Spring Web :web支撑模块,和Spring Web MVC一起
5. Spring Web MVC
6. Spring Context :是IOC的模块
7. Spring Core : 核心,管理对象的模块,是Spring的基础支撑
三、Spring IOC基础
1.控制反转IOC(inversion of Control)
是指容器控制程序对象之间的关系,而不是传统实现中,有由程序代码直接操控控制权由应用代码中转到了外部容器中,控制权的转移是所谓反转。
依赖注入:即组件之间的依赖关系由容器在运行期间决定的,即容器动态地将某种依赖关系注入到组件之中。
白话理解:IOC就是依赖注入,因为IOC控制反转所以依赖注入。之前想要用别的类的方法,是通过自己new对象去实现他的方法,而现在是由IOC容器new好之后带过来给你,所以比较依赖于Spring IOC容器,这种new对象的控制权由自己换成别人,这就是控制反转。
2.加载过程
①(applicationContext.xml)读取配置文件
②POJO 根据数据创建和组装Bean ---> Spring IoC Container <--- ③从容器中获取Bean
3.applicationContext的实现的四种方式:
- FileSystemXmlApplicationContext :根据项目找
- ClassPathXmlApplicationContext :根据resource是文件夹,找配置文件。
- XmlWebApplicationContext:在Web环境下初始化监听器的时候会加载该类。
- AnnotationConfigApplicationContext:根据注解的方式启动 Spring 容器。
四、Spring IOC实现方式
1.xml方式(属性)
①新建quickstar模板项目
②导入Spring-context 包
③在resources文件下面新建XML配置文件,按模板建,名称先标准化起为:applicationContext.xml
④在applicationContext.xml文件中注册bean :
<bean id = "新产生的对象名" class = "要产生对象的类地址.数据类型">
<property name="属性名" ref="引用" value="值" /> //常见类型赋值
</bean>
//集合赋值
<bean id = "新产生的对象名" class = "数据类型">
<property name="集合名">
<set|list|array>
<value>值</value>
</set|/list|/array>
</proprety>
//map集合赋值
<property name="集合名">
<map>
<entry key="键值" value="值"/>
</map>
</bean>
//引用赋值
<bean id="新产生的对象名" class="数据类型">
<property name="赋值对象名称" ref="引用对象名" />
</bean>
⑤加载applicationContext.xml文件:
ApplicationContext bean(只是名字) = new ClassPathXmlApplicationContext("applicationContext.xml");
bean.getBean("参数");//byName
bean.getBean("",DemoA.class); //byName + byType
bean.getBean(DemoA.class); //byType
2.xml方式(构造器)
①给构造器赋值方式:
<bean id="" class="">
<constructor-arg name="名字" index="构造器中变量的索引号(从0开始)" ref="引用" value="值" type="类型"(可省略)/>
</bean>
3.IOC模块 注解方式
a)创建对象的注解:
@Component | 启动Spring后,会自动把它转成容器管理的Bean。 |
@Repository | 用于对DAO实现类进行注解。 |
@Service | 用于对业务层注解,但是目前该功能与 @Component 相同。(Biz包) |
@Controller | 用于对控制层注解,但是目前该功能与 @Component 相同。(其他包) |
- 以上四个在规则上都一样,但是规范上不一样,不同的注解在规范上表达不同的意思;
- 注解时未命名,则默认名字为类名首字母小写,若要命名,则如:@Controller(value="名") 缩写可省略value;
b)赋值注解:
@Resource | 默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。 如:@Resource(name="名"),如果不写名字,则以当前给值的变量名来,找不到则按类型找,若指定name,则按照指定名字来找,不会再按类型找了。 |
@Autowired | 默认是按照类型装配注入的,后面不需要参数。如果想按照名称来转配注入,则需要结合@Qualifier一起使用。 |
@Value | 通过@value可以个给想要的属性赋值,如:@value("值"),且值会自动类型转换。 |
@Qualifier | @Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。它不能独立写,要与@Autowired搭配写。 |
4、Spring 管理 mybatis
①导入jar包:spring-context、mysql-connector-java、mybatis、mybatis-spring、druid、spring-jdbc(版本应与spring-context尽量保持一致)
②在resources文件夹中创建spring.xml文件:
a) 创建数据源
b)创建一个会话工厂
c) 加载mapper包内容,产生mapper的代理对象
<!--创建数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="name" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/bd2006?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"/>
<property name="username" value="root"/>
<property name="password" value="a123456"/>
</bean>
<!--创建一个会话工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--加载mapper包的内容,产生mapper的代理对象-->
<bean id="msc" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.example.mapper(就是具体要扫描的mapper包地址)"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>