1.是开源的,用来简化企业级应用开发的开发框架
1)简化开发
2)解耦18:48 2017/8/15
3)集成其他框架
2.spring容器 是spring框架当中的一个核心模块,用来管理对象(包括对象的创建、初始化、销毁)
启动Spring容器的步骤
a、导包 ---在maven上导 spring-webmvc 3.2.8版本
b、添加配置文件 将applicationContext.xml这个文件复制到resource文件夹下
c、启动spring容器 在/main/java文件夹下创建一个类,在这个类中写两行代码 String config="applicationContext.xml";
/*ApplicationContext:是一个接口
ClassPathXmlApplicationContext:是实现上面接口的具体类,这个类依据类路 径
去查找配置文件,然后启动spring容器*/
ApplicationContext ac=new ClassPathXmlApplicationContext(config);
3.如何创建对象(让spring容器依据配置文件创建对象)相当于以前的那种new 一个对象,new对象的时候自动调用构造方法。
方法一、利用无参构造器
1)为一个类添加无参构造器
2)在配置文件当中,添加一个bean元素。(配置文件指的是applicationContext.xml)
<bean id="a1" class="first.Apple"/>添加这句
其中id属性要求要唯一的不能重复,名字可以随便取只要不重复即可
class属性,写的是类的完整的名字即:包名.类名
3)启动容器,调用容器的getBean方法来获得对象
//通过容器获得对象
//getBean方法:第一个参数是Bean的id值
//第二参数是该对象对应的class对象 即:写类名.class
Apple a1=ac.getBean("a1",Apple.class);//返回的是一个Object的对象
方法二、利用静态工厂方法来创建对象(了解)
注:通过调用类的静态方法来创建对象。
<!-- 利用静态工厂方法来创建对象
factory-method属性:指定一个静态方法名。
容器会调用类的静态方法来创建对象
-->
<bean id="a3" class="java.util.Calendar" factory-method="getInstance"/>
方法三、实例化工厂方法来创建对象(了解)
注:通过调用对象的实例方法来创建对象。
<!-- 利用实例工厂方法来创建对象
factory-bean属性:指定bean的id
容器会调用该bean的实例方法来创建对象
-->
<bean id="a4" factory-bean="a3" factory-method="getTime"/>
4.生命周期的管理
1)初始化(就是分配资源)
在<bean id="a1" class="first.Apple" init-method="init"/> 添加init-method="init"这个属性,这样就在实例化的时候也初始化了
2)销毁(回收资源)
<bean id="mb1" class="basic.MessageBean" destroy-method="destroy"/>添加destroy-method="destroy"这个属性,这样在关闭容器前就会调用这个销毁方法
调用close方法关闭容器的话,在启动容器的那边要用AbstractApplicationContext ,只有这个下面才有close方法
注:当作用域为单例Singleton的时候销毁方法才能骑作用(默认就是Singleton)
5.作用域
a、默认情况下,对于某一个bean来说,无论调用多少次getBean方法都只有一个对象
b、如果想要每调用getBean方法就创建一个新的对象,就在<bean id="a1" class="first.Apple"/>里添加scope属性,值为prototype(这个称谓原型) <bean id="sb1" class="basic.ScopeBean" scope="prototype"/>
scope的默认值为singleton
6.延迟加载
1)默认情况下,容器启动之后,会将所有的单例的(singleton) 的bean全部实例化
2)要想让其延迟加载,也就是说让其在获取对象的时候再实例化,要在bean中添加lazy-init属性,设置为true
这样在容器启动的时候,不会进行实例化,只有在获取对象的时候再实例化
7.IOC和DI
1)Inversion of Control 控制反转 对象之间的依赖关系由原来的通过new来建立的转为由容器来建立
2)DI Dependency Inject 依赖注入 容器通过调用set方法或构造方法来建立依赖关系
IOC是一种思想,是要达到的目的 DI是达到这个目的的手段,方法
3)依赖注入的两种方式
a、set方法注入
第一步:为类添加一个set方法
第二步:在配置文件当中添加<property>标签,表示这是用set方法注入依赖关系
<!-- 使用set方法来注入依赖关系
property元素:表示的是set方法注入
name属性:指定了属性名,即调用哪个set方法(将name的值的首字母大写再在前面加上set,就是调用的这个方法)
ref属性:指定注入的bean的id,即将ref指定的那个对象作为参数传入到set方法中 -->
<bean id="b1" class="ioc.B"/>
<bean id="a1" class="ioc.A">
<property name="b" ref="b1"/>
</bean>
这是将B注入到A中,A中可以调用执行B的方法
b、构造器注入
第一步、添加响应的构造器
第二步、使用<constructor-arg index="0" ref="a1"/>来表示用构造器注入依赖关系
constructor-arg属性:表示使用构造器注入
index属性:表示参数的下标,下标是从0开始的,如果有多个参数,就要写多个<constructor-arg\>标签
ref属性:表示要注入进来的类的id
4)自动装配注入(了解)
a、 默认情况下。容器不会自动装配
b、自动装配,指的是容器依据某些规则,自动建立对象之间的依赖关系
注:容器任然要通过调用set方法或则构造器来建立依赖关系
<!-- 自动分配
autowire属性:表示让spring容器按照某些规则自动建立对象之间的依赖关系
byName属性:根据类中的属性名(即成员变量名)去查找对应的bean的id,找到之后
调用对应的set方法
注意点:要注入的那个类的id要和被注入的那个类里面的成员变量名一样,
如果找不到对应的bean的id,就不会注入
byType属性:容器依据属性类型(即成员变量名的类型)去查找对应的bean的class
找到之后调用对应的set方法 ,如果找到多个会报错
constructor属性:与byType类似,找到之后调用对应的构造器
-->
<bean id="w" class="auto.Waiter"/>
<bean id="r" class="auto.Restaurant" autowire="byName"/>
8、注入基本类型的值
<!-- 注入基本类型的值
value属性:用来注入基本类型的值(也就是给变量赋值)
name属性:是要赋值的变量 -->
<bean id="stu" class="value.Student">
<property name="name" value="donghaihua"/>
<property name="age" value="27"/>
</bean>
9、注入集合类型的值
list类型的 <bean id="stu" class="value.Student">
<property name="interest"> name指的是要赋值的变量
<list>
<value>读书</value>
<value>敲代码</value>
</list>
</property>
Set类型的 <property name="city">
<set>
<value>北京</value>
<value>上海</value>
<value>南京</value>
</set>
</property>
Map类型的 <property name="score">
<map>
<entry key="english" value="8"/>
<entry key="math" value="2"/>
</map>
</property>
properties类型的 <property name="db">
<props>
<prop key="user">hexinwen</prop>
<prop key="pwd">123</prop>
</props>
</property>
10、应用的方式注入集合类型的值
先将集合类型的值配置成一个bean
使用ref属性类注入这个bean
<!-- 用引用方式注入集合类型的值 -->
<!--先将集合类型的值配置成一个bean
注:命名空间:为了区分通同名的元素,在元素前添加的一个限定(为了避免命名空间冲突,经常是一个域名)
-->
<util:list id="aaa">
<value>杭州</value>
<value>郑州</value>
<value>徐州</value>
</util:list>
<util:set id="bbb">
<value>山西</value>
<value>山东</value>
<value>江西</value>
</util:set>
<util:map id="ccc">
<entry key="english" value="8"/>
<entry key="math" value="2"/>
</util:map>
<util:properties id="ddd">
<prop key="user">hexinwen</prop>
<prop key="pwd">123</prop>
</util:properties>
<bean id="stu2" class="value.Student">
<property name="interest" ref="aaa"/>
<property name="city" ref="bbb"/>
<property name="score" ref="ccc"/>
<property name="db" ref="ddd"/>
</bean>
11、读取属性文件(.properties文件)
<!-- 读取属性文件的内容
location属性:指定属性文件的位置(classpath表示让容器依据类路径去查找)
注:容器依据location指定的位置找到对应的属性文件,然后读取属性文件的内容
并将这些聂彤添加到proper贴对上上
-->
<util:properties id="fff" location="classpath:config.properties"/>
12、Spring表达式
作用 用于读取其他bean的属性以及集合类型的值
a、基本类型的值
语法 #{id.name} id指向的对象的下面的变量name的值
b、list集合的值
语法:<property name="interest" value="#{stu.interest[1]}"/> interest[1]这个表示读取stu对象下面的interest属性下面的第几个value的值
c、map集合的值
<property name="score" value="#{stu.score.english}"/> stu.score.english这个表示读取stu对象下面的score属性下面key为English的值,也可以写成 #{stu.score['english']}
d、从配置文件里读取想要的值
<property name="pageSize" value="#{fff['pageSize']}"/> fff['pageSize']这个表从id为fff的那个配置文件里面读取pageSize的属性的值
13、使用注解简化配置文件
1)组件扫描
Spring容器启动只有,会检查某个包以及子包下面的所有的类,如果该类前面添加了一些特定的注解,则容器hi将该类纳入容器进行管理(相当于配置了一个bean元素)
语法: <!-- 配置主键扫描
base-package属性:指定要扫描的包名 写的是包名
注:容器启动之后会扫描该包以及子包,下面所有的类,如果该类前面有特定的注解(例如@cmponent)
那么容器会将该类纳入容器进行管理(相当于配置了一个bean元素) -->
<context:component-scan base-package="annotation"/>
在用getBean方法获取对象的时候,id的位置可以使用缺省id(就是将类名小写后,就是缺省id),也可以在类的注解的后面加("id"),例如@Component("a1")
2)进行组件扫描的步骤(这样就不要在添加<bean>来配置了)
第一步:在配置文件中添加
<context:component-scan base-package="annotation"/>
第二步:在类的前面添加一些注解
例如:@Component @Named @Repository @Service @Controller
3)初始化方法的注解 @PostConstruct 指定初始化的那个方法 需要从maven上导包 盗annotation 1.2的那个版本 ,导入到pom.xml的 写在方法前面
销毁方法的注解 @PreDestroy 指定销毁的那个方法 写在方法前面
作用域的注解 @Scope("prototype") 写在类的前面
延迟加载的注解 @Lazy(true) 卸载类的前面
4)使用注解进行依赖关系的注入
用注解的set方式注入
a、@Autowired
public void setWt(@Qualifier("wt") Waiter wt) { //@Qualifier("wt") 指定要注入的那个类的id 如果不写@Qualifier("wt")会按照byType的方式自动装配
this.wt = wt;
System.out.println("set的方法");
}
用注解的有参构造注入
@Autowired
public Leader(@Qualifier("wt") Waiter wt){
this.wt=wt;
System.out.println("领导的无参构造器");
}
@Autowired表示set方法和有参构造器方法注入都支持
如果是set方法注入,可以将@Autowired这个注解写在set方法前,也可以写在成员变量前这时不用写set方法
b、 @Resource(name="wt")
public void setWt(Waiter wt) {
this.wt = wt;
System.out.println("经理的set方法");
}
@Resource(name="wt")表示用set方法注入依赖关系 同样和@Autowired也可以写在成员变量前这时不用谢set方法 这个注解只支持set方法的注入5
name属性表示要注入进来的类的id
5)注入基本类型的值的相关注解
给基本类型的变量用注解方式赋值 用@Value() 这个注解
@Value("donghaihua")
private String name;
@Value("#{config.pageSize}") 从配置文件中读取 也可以写成 @Value("#{config['pageSize']}")
private String pageSize;
这个注解可以写在属性变量的前面,也可以写在set方法的前面
用这个时候不能用bean注入class,也要用注解方式将类注入
1)简化开发
2)解耦18:48 2017/8/15
3)集成其他框架
2.spring容器 是spring框架当中的一个核心模块,用来管理对象(包括对象的创建、初始化、销毁)
启动Spring容器的步骤
a、导包 ---在maven上导 spring-webmvc 3.2.8版本
b、添加配置文件 将applicationContext.xml这个文件复制到resource文件夹下
c、启动spring容器 在/main/java文件夹下创建一个类,在这个类中写两行代码 String config="applicationContext.xml";
/*ApplicationContext:是一个接口
ClassPathXmlApplicationContext:是实现上面接口的具体类,这个类依据类路 径
去查找配置文件,然后启动spring容器*/
ApplicationContext ac=new ClassPathXmlApplicationContext(config);
3.如何创建对象(让spring容器依据配置文件创建对象)相当于以前的那种new 一个对象,new对象的时候自动调用构造方法。
方法一、利用无参构造器
1)为一个类添加无参构造器
2)在配置文件当中,添加一个bean元素。(配置文件指的是applicationContext.xml)
<bean id="a1" class="first.Apple"/>添加这句
其中id属性要求要唯一的不能重复,名字可以随便取只要不重复即可
class属性,写的是类的完整的名字即:包名.类名
3)启动容器,调用容器的getBean方法来获得对象
//通过容器获得对象
//getBean方法:第一个参数是Bean的id值
//第二参数是该对象对应的class对象 即:写类名.class
Apple a1=ac.getBean("a1",Apple.class);//返回的是一个Object的对象
方法二、利用静态工厂方法来创建对象(了解)
注:通过调用类的静态方法来创建对象。
<!-- 利用静态工厂方法来创建对象
factory-method属性:指定一个静态方法名。
容器会调用类的静态方法来创建对象
-->
<bean id="a3" class="java.util.Calendar" factory-method="getInstance"/>
方法三、实例化工厂方法来创建对象(了解)
注:通过调用对象的实例方法来创建对象。
<!-- 利用实例工厂方法来创建对象
factory-bean属性:指定bean的id
容器会调用该bean的实例方法来创建对象
-->
<bean id="a4" factory-bean="a3" factory-method="getTime"/>
4.生命周期的管理
1)初始化(就是分配资源)
在<bean id="a1" class="first.Apple" init-method="init"/> 添加init-method="init"这个属性,这样就在实例化的时候也初始化了
2)销毁(回收资源)
<bean id="mb1" class="basic.MessageBean" destroy-method="destroy"/>添加destroy-method="destroy"这个属性,这样在关闭容器前就会调用这个销毁方法
调用close方法关闭容器的话,在启动容器的那边要用AbstractApplicationContext ,只有这个下面才有close方法
注:当作用域为单例Singleton的时候销毁方法才能骑作用(默认就是Singleton)
5.作用域
a、默认情况下,对于某一个bean来说,无论调用多少次getBean方法都只有一个对象
b、如果想要每调用getBean方法就创建一个新的对象,就在<bean id="a1" class="first.Apple"/>里添加scope属性,值为prototype(这个称谓原型) <bean id="sb1" class="basic.ScopeBean" scope="prototype"/>
scope的默认值为singleton
6.延迟加载
1)默认情况下,容器启动之后,会将所有的单例的(singleton) 的bean全部实例化
2)要想让其延迟加载,也就是说让其在获取对象的时候再实例化,要在bean中添加lazy-init属性,设置为true
这样在容器启动的时候,不会进行实例化,只有在获取对象的时候再实例化
7.IOC和DI
1)Inversion of Control 控制反转 对象之间的依赖关系由原来的通过new来建立的转为由容器来建立
2)DI Dependency Inject 依赖注入 容器通过调用set方法或构造方法来建立依赖关系
IOC是一种思想,是要达到的目的 DI是达到这个目的的手段,方法
3)依赖注入的两种方式
a、set方法注入
第一步:为类添加一个set方法
第二步:在配置文件当中添加<property>标签,表示这是用set方法注入依赖关系
<!-- 使用set方法来注入依赖关系
property元素:表示的是set方法注入
name属性:指定了属性名,即调用哪个set方法(将name的值的首字母大写再在前面加上set,就是调用的这个方法)
ref属性:指定注入的bean的id,即将ref指定的那个对象作为参数传入到set方法中 -->
<bean id="b1" class="ioc.B"/>
<bean id="a1" class="ioc.A">
<property name="b" ref="b1"/>
</bean>
这是将B注入到A中,A中可以调用执行B的方法
b、构造器注入
第一步、添加响应的构造器
第二步、使用<constructor-arg index="0" ref="a1"/>来表示用构造器注入依赖关系
constructor-arg属性:表示使用构造器注入
index属性:表示参数的下标,下标是从0开始的,如果有多个参数,就要写多个<constructor-arg\>标签
ref属性:表示要注入进来的类的id
4)自动装配注入(了解)
a、 默认情况下。容器不会自动装配
b、自动装配,指的是容器依据某些规则,自动建立对象之间的依赖关系
注:容器任然要通过调用set方法或则构造器来建立依赖关系
<!-- 自动分配
autowire属性:表示让spring容器按照某些规则自动建立对象之间的依赖关系
byName属性:根据类中的属性名(即成员变量名)去查找对应的bean的id,找到之后
调用对应的set方法
注意点:要注入的那个类的id要和被注入的那个类里面的成员变量名一样,
如果找不到对应的bean的id,就不会注入
byType属性:容器依据属性类型(即成员变量名的类型)去查找对应的bean的class
找到之后调用对应的set方法 ,如果找到多个会报错
constructor属性:与byType类似,找到之后调用对应的构造器
-->
<bean id="w" class="auto.Waiter"/>
<bean id="r" class="auto.Restaurant" autowire="byName"/>
8、注入基本类型的值
<!-- 注入基本类型的值
value属性:用来注入基本类型的值(也就是给变量赋值)
name属性:是要赋值的变量 -->
<bean id="stu" class="value.Student">
<property name="name" value="donghaihua"/>
<property name="age" value="27"/>
</bean>
9、注入集合类型的值
list类型的 <bean id="stu" class="value.Student">
<property name="interest"> name指的是要赋值的变量
<list>
<value>读书</value>
<value>敲代码</value>
</list>
</property>
Set类型的 <property name="city">
<set>
<value>北京</value>
<value>上海</value>
<value>南京</value>
</set>
</property>
Map类型的 <property name="score">
<map>
<entry key="english" value="8"/>
<entry key="math" value="2"/>
</map>
</property>
properties类型的 <property name="db">
<props>
<prop key="user">hexinwen</prop>
<prop key="pwd">123</prop>
</props>
</property>
10、应用的方式注入集合类型的值
先将集合类型的值配置成一个bean
使用ref属性类注入这个bean
<!-- 用引用方式注入集合类型的值 -->
<!--先将集合类型的值配置成一个bean
注:命名空间:为了区分通同名的元素,在元素前添加的一个限定(为了避免命名空间冲突,经常是一个域名)
-->
<util:list id="aaa">
<value>杭州</value>
<value>郑州</value>
<value>徐州</value>
</util:list>
<util:set id="bbb">
<value>山西</value>
<value>山东</value>
<value>江西</value>
</util:set>
<util:map id="ccc">
<entry key="english" value="8"/>
<entry key="math" value="2"/>
</util:map>
<util:properties id="ddd">
<prop key="user">hexinwen</prop>
<prop key="pwd">123</prop>
</util:properties>
<bean id="stu2" class="value.Student">
<property name="interest" ref="aaa"/>
<property name="city" ref="bbb"/>
<property name="score" ref="ccc"/>
<property name="db" ref="ddd"/>
</bean>
11、读取属性文件(.properties文件)
<!-- 读取属性文件的内容
location属性:指定属性文件的位置(classpath表示让容器依据类路径去查找)
注:容器依据location指定的位置找到对应的属性文件,然后读取属性文件的内容
并将这些聂彤添加到proper贴对上上
-->
<util:properties id="fff" location="classpath:config.properties"/>
12、Spring表达式
作用 用于读取其他bean的属性以及集合类型的值
a、基本类型的值
语法 #{id.name} id指向的对象的下面的变量name的值
b、list集合的值
语法:<property name="interest" value="#{stu.interest[1]}"/> interest[1]这个表示读取stu对象下面的interest属性下面的第几个value的值
c、map集合的值
<property name="score" value="#{stu.score.english}"/> stu.score.english这个表示读取stu对象下面的score属性下面key为English的值,也可以写成 #{stu.score['english']}
d、从配置文件里读取想要的值
<property name="pageSize" value="#{fff['pageSize']}"/> fff['pageSize']这个表从id为fff的那个配置文件里面读取pageSize的属性的值
13、使用注解简化配置文件
1)组件扫描
Spring容器启动只有,会检查某个包以及子包下面的所有的类,如果该类前面添加了一些特定的注解,则容器hi将该类纳入容器进行管理(相当于配置了一个bean元素)
语法: <!-- 配置主键扫描
base-package属性:指定要扫描的包名 写的是包名
注:容器启动之后会扫描该包以及子包,下面所有的类,如果该类前面有特定的注解(例如@cmponent)
那么容器会将该类纳入容器进行管理(相当于配置了一个bean元素) -->
<context:component-scan base-package="annotation"/>
在用getBean方法获取对象的时候,id的位置可以使用缺省id(就是将类名小写后,就是缺省id),也可以在类的注解的后面加("id"),例如@Component("a1")
2)进行组件扫描的步骤(这样就不要在添加<bean>来配置了)
第一步:在配置文件中添加
<context:component-scan base-package="annotation"/>
第二步:在类的前面添加一些注解
例如:@Component @Named @Repository @Service @Controller
3)初始化方法的注解 @PostConstruct 指定初始化的那个方法 需要从maven上导包 盗annotation 1.2的那个版本 ,导入到pom.xml的 写在方法前面
销毁方法的注解 @PreDestroy 指定销毁的那个方法 写在方法前面
作用域的注解 @Scope("prototype") 写在类的前面
延迟加载的注解 @Lazy(true) 卸载类的前面
4)使用注解进行依赖关系的注入
用注解的set方式注入
a、@Autowired
public void setWt(@Qualifier("wt") Waiter wt) { //@Qualifier("wt") 指定要注入的那个类的id 如果不写@Qualifier("wt")会按照byType的方式自动装配
this.wt = wt;
System.out.println("set的方法");
}
用注解的有参构造注入
@Autowired
public Leader(@Qualifier("wt") Waiter wt){
this.wt=wt;
System.out.println("领导的无参构造器");
}
@Autowired表示set方法和有参构造器方法注入都支持
如果是set方法注入,可以将@Autowired这个注解写在set方法前,也可以写在成员变量前这时不用写set方法
b、 @Resource(name="wt")
public void setWt(Waiter wt) {
this.wt = wt;
System.out.println("经理的set方法");
}
@Resource(name="wt")表示用set方法注入依赖关系 同样和@Autowired也可以写在成员变量前这时不用谢set方法 这个注解只支持set方法的注入5
name属性表示要注入进来的类的id
5)注入基本类型的值的相关注解
给基本类型的变量用注解方式赋值 用@Value() 这个注解
@Value("donghaihua")
private String name;
@Value("#{config.pageSize}") 从配置文件中读取 也可以写成 @Value("#{config['pageSize']}")
private String pageSize;
这个注解可以写在属性变量的前面,也可以写在set方法的前面
用这个时候不能用bean注入class,也要用注解方式将类注入