Spring入门: 基本配置: 把对象的创建交给spring的管理 程序员不再关注对象的创建 对象的创建的过程:
1、写一个java类
2、写一个spring的配置文件,把该类放入到spring容器中
<bean id="helloWorld" class="cn.itheima03.spring.ioc.createobject.HelloWorld"></bean>
3、启动spring容器
4、把对象从spring容器中取出来
5、对象调用方法
说明:bean中的id值是唯一的,不能出现相同的ID值
spring创建bean的方式
1、默认的构造函数
2、利用静态工厂方法
1、提供静态工厂类
2、在spring的配置文件中提供工厂方法
<bean id="helloWorld_Factory" class="cn.itheima03.spring.ioc.create.HelloWorldFactory" factory-method="getInstance"></bean>
3、实例工厂方法
spring的scope
1、spring创建对象默认是单例模式
如果把一个list声明在该bean的属性中,这样list成了共享的数据,所以一般情况下把list声明在方法中
2、把spring创建的bean改成prototype模式,只需要写一个属性:scope为prototype
spring什么时候创建对象
1、在默认情况下,spring容器启动的时候,就创建对象了
有利于开发:
当spring容器启动的时候,如果配置文件中有错误,则会报错
2、当从spring容器中获取bean,当bean调用方法的时候创建对象
如果所有的bean按照这种模式加载,当spring容器启动的时候是不会报错的
如果一个bean中有大量的数据,需要的是用到的情况下加载
spring容器的初始化和销毁:init
前提条件:spring中的bean是单例的
1、在一个bean中可以提供init方法和destroy方法
2、当创建对象完成以后,直接执行init方法,该方法由spring容器来执行
3、当spring容器关闭的时候,执行destroy方法,该方法由spring容器来执行,由该方法释放资源
说明:
如果spring中的bean是多例的情况下,spring容器不负责对象的销毁,由程序员把该对象设置为null
如果spring中的bean是多例,这个时候,不管在配置文件中lazy-init设置成什么样的值,在context.getBean时才要创建对象,而且不负责销毁
spring的DI:依赖注入
给属性赋值:
依靠的是bean的set方法。
构造函数赋值:
public class Person{
private Long pid;
private String pname;
private Student student;
private Set sets;
private List lists;
private Map map;
private Properties properties;
}
步骤:
1、写一个javabean
2、在javabean中声明几个属性
3、属性的set和get方法
4、写spring的配置文件
<bean id="person" class="cn.itheima03.spring.di.Person">
<!--
property用来描述属性
-->
<property name="pid" value="1"></property>
<property name="pname" value="王二麻子"></property>
</bean>
5、在客户端进行调用
原理:
1、启动spring容器
2、spring容器为person创建对象
3、利用property中的name属性可以把set方法拼接出来
4、利用java的反射机制,给属性赋值
说明:在默认的情况下,第3、4步在spring容器启动的时候完成了,把这样的过程叫做bean的装配
说明:
把list,set,map的值写在配置文件中,大部分的值都是固定的,用来装配这些集合的。例如:
可以把hibernate所有的映射文件装配在list中,而这个装配可以写在配置文件中
可以利用构造函数给属性赋值
<bean id="person_con" class="cn.itheima03.spring.di.constructor.Person">
<constructor-arg index="0" value="王二麻子"></constructor-arg>
<constructor-arg index="1" ref="student_con"></constructor-arg>
</bean>
通过以上方式也可以给属性赋值,同时创建对象用该构造器就可以了,不用默认的构造函数了
但是如果不写constructor-arg,则spring容器会用默认的构造函数创建对象。
spring容器的继承机制:
parent
abstract
<bean id="person_extends" class="cn.itheima03.spring.extend.Person" abstract="true">
<property name="s" value="aaaa"></property>
</bean>
<bean id="student_extends" class="cn.itheima03.spring.extend.Student" parent="person_extends"></bean>
上述的parent:让student_extends拥有person_extends的属性的值
abstract:不让person_extends创建对象。
利用spring注解的形式实现DI
1、在spring的配置文件中,加入命名空间
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
2、在spring的配置文件中,开启注解解析器
<context:annotation-config></context:annotation-config>
3、把person和student放入到spring容器中
<bean id="person" class="cn.itheima03.spring.di.annotation.Person"></bean>
<bean id="student" class="cn.itheima03.spring.di.annotation.Student"></bean>
4、在Person类中的student不需要set和get方法
原理:
1、当启动spring容器的时候,给spring容器的bean创建对象
2、当spring容器解析到<context:annotation-config></context:annotation-config>的时候,
spring容器扫描在spring容器中的bean
3、查看bean中的属性或者方法上有没有@Resource
1、有
1、如果该注解的属性name的值为"",则会按照属性的名称和spring中的ID值进行匹配,如果匹配
成功,则赋值,如果匹配不成功,则按照类型进行匹配,如果类型匹配不成功,则报错
2、如果该注解的属性name的值不为"",则按照name属性的值和spring中的ID值进行匹配,
如果匹配成功,则赋值,匹配不成功,则报错
2、没有
说明:
基本类型不能用注解赋值
注解的效率没有xml文件的高,但是书写比较简单
Autowired按照类型进行匹配
@Autowired
@Qualifier("studen")按照ID进行匹配
按照类型匹配比较危险
类扫描的机制
步骤:
1、在spring的配置文件中,引入命名空间
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
2、<context:component-scan base-package="cn.itheima03.spring.scan"></context:component-scan>
既包含了依赖注入的注解解析器,还包含了类扫描的
3、在一个类上标注注解@Component
public class Person {}
==
<bean id="person" class="..Person">
@Component("aa")
public class Person {}
==
<bean id="aa" class="..Person">
spring容器会为该bean创建对象,id值为
如果该注解没有value属性,则值为类的第一个字母变成小写,其他的不变
如果有value属性,则用value属性的值作为ID的值
4、执行@Resource注解的流程
使用的注解越多,在xml文件中写的内容越少,效率越低
更多典型化注解:
@Controller
@Service
@Repository
其作用和用法与@Component保持一致
注意:
在一个类中有一个基本类型的属性,如果该类是以注解的形式放入到spring容器中的,基本属性在这里是没有办法赋值的
利用注解的方式实现继承,不需要使用Parent