1.由问题带入Spring
1.1.早期的架构
刚开始的MVC层架构的模式,创建对象的决定权还是在程序员手中
随着类越来越多,那我们就必须用哪个创建哪个,很费事
所以我们引入了Set方式
我们以这样的方式,将所生成对象的权利交给用户,这样可以大大减少程序员的工作量
1.2.Spring简介
早期的程序员又从中间插入了更多的方式来解决这个问题,在2002年的时候曾出现过一个框架interface21,出现了spring框架的雏形,在不断发展的过程中,在2004年3月24日,基于interface21框架,spring出现了,迎来了我们程序员的春天,他以不一样的构建方式,进入到我们的身边。
spring的优点:
- 是一个开源的项目(现在在GitHub)上面
- 是一个轻量级的,非入侵式的框架(到时候不使用该框架时,只要修改部分代码,程序仍然可以使用)
- 两大重要思想IoC,AOP
- 支持事务,容易整合其他框架
1.3.Spring环境搭建
spring framework官网:https://spring.io/projects/spring-framework/
在之前我们一直使用的是meven搭建模式,我们去meven仓库链接spring
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
一般情况我们还会直接引入jdbc,便于我们后期直接使用
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
1.4.Spring使用
我们将从maven仓库将所需要的包下载下来,就可以开始使用了。
首先我们创建一个hello类,实现我们的spring-helloworld(只包含一个简单的属性和set,get,tostring方法)。
然后开始配置ApplicationContext.xml文件,这个文件配置我们从官网上直接拷贝
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
然后我们就可以直接在这个配置文件中进行配置
在配置文件中:
- bean就像之前我们new的对象
- id就是我们之前的对象名
- class就是实体类的路径
- name就是起别名,可以起多个别名
- property为其中的属性赋值
- name为属性名
- value为该属性的值
测试:
使用ClassPathXmlApplicationContext获得容器对象,在容器加载的时候,配置在容器中的bean都被创建,通过context需要谁获取谁就行。
2.Spring使用
2.1.创建对象的方法
spring默认是通过走对象的无参构造器进行创建对象的,如果有了有参构造器,可以用以下方法进赋值
在一般情况下,如果我们没有默认无参构造器时,我们采用第二种方式,通过参数名进行赋值。
2.2.ApplicationContext.xml配置
还可以在配置文件中使用import引入其他的配置文件
2.3.依赖注入(重点)
注意:在使用map和property属性是写入参数的关键字
<property name="card">
<map>
<entry key="身份证" value="610123456678998520"></entry>
<entry key="银行卡" value="987654321000000000"></entry>
</map>
</property>
<property name="url">
<props>
<prop key="driver">driver</prop>
<prop key="url">locakhost:8080</prop>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
2.4.拓展方式注入
拓展注入方式有两种,一个为p注入(使用无参构造器使用,在bean后面直接使用p:字段名,就可以赋值),一个为c注入(使用有参构造器使用,在bean后面直接使用c:字段名,就可以赋值)
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
2.5.bean的作用域
作用域scope:一般情况下只使用两个
-
singleton:单例模式
-
prototype:原型模式(创建出来的都不相同)
2.6.Bean的自动装配
使用自动装配就是在bean的配置后面加入autowrie属性,其中有两个
-
byName:根据名字进行匹配,在对象set后面的名字必须和bean的名字一致,名字不一致会报错
- -
byType:根据类型进行匹配,根据实现类的class寻找bean,可以不加beanid,有多个类会报错
2.7.使用注解自动装配(@Autowired)
第一步:首先需要引入注解的约束
xmlns:context="http://www.springframework.org/schema/context"
<context:annotation-config/>
在使用之前,必须先配置好这两个东西
小结:
@Autowired配置之后,先是根据类型进行匹配,如果有多个类型,则根据名称匹配,如果名称不符就报错。在多个对象的情况下,与@Qualifier(value = “beanid”)进行匹配,如果匹配不上不会根据类型匹配,直接报错。
@Resource(不是spring的注解,是javax的注解)首先会根据名称匹配,匹配不上根据类型匹配,类型匹配不上则报错。在多个类型的情况下使用@Resource(name = “beanid”)进行匹配,匹配不上直接报错。
2.8.注解开发
使用注解开发,首先得开启注解驱动,以及扫描包中的注解
<context:annotation-config/>
<!-- 扫描这个包下所有的注解-->
<context:component-scan base-package="com.yy"/>
在使用中@Component就如之前的bean,@value就如之前的property
为了适应分层架构,我们通过@Component衍生出其他的注解
@component:等同于注册bean(用在pojo类)
@Repository:等同于@component(用在dao层)
@serverice:等同于@component(用在service层)
@Controller:等同于@component(用在controller层)
@value:等同于注入值
@scope:等同于作用域
在我们平时的使用中,我们一般情况下使用配置文件配置bean,用注解对其进行赋值。
2.9.用Java进行配置
在spring4之后就直接可以用java文件来配置ApplicationContext.xml文件了。
//标志这个类为配置类
@Configuration
//扫描这个包下的所有注解
@ComponentScan("com.yy")
//引入其他的配置文件
@Import(yyconfig1.class)
public class yyconfig {
@Bean
// 之前的配置bean,返回值为之前的class,类名为之前的ID
public user getuser(){
// 返回对象就是要注入的对象
return new user();
}
}