您的位置:首页 > 编程语言 > Java开发

Spring01

2016-05-24 21:20 288 查看
1.spring(官网:www.spring.io)

1)定义:是一个轻量级的开源的应用开发框架

2)应用开发框架特点:

*简化代码: spring把一些常用的API做了一层封装,

比如:使用spring JDBC访问数据库,就不再需要编写获得连接与关闭连接的代码

*解耦: spring容器帮我们管理对象与对象之间的关系,故对象之间是松耦合的,方便以后代码的维护

*集成: 可以集成其它的第三方的框架,比如定时任务处理(Quartz)

2.spring容器

1)spring框架中的一个重要模块,用来管理对象

2)启动

*将spring相关的jar文件导入

*准备spring配置文件(告诉容器创建哪些对象)

*启动容器 ApplicationContext ac=new ClassPathXmlApplicationContext("配置文件路径名");

3)创建一个对象

*无参构造器 spring容器将所有的被其管理的java类都称之为JavaBean

配置文件中配置需要实例化的类,然后启动容器,调用其getBean()方法即可

eg:<bean id="d1" class="java.util.Date"/> //id属性:要求唯一 class属性:写完整的类名 包名+类名

Date d1=ac.getBean("d1",Date.class);

*静态工厂方法

配置文件配置好,其余同

eg:<bean id="c1" class="java.util.Calendar" factory-method="getInstance"/> //factory-method属性:指定要调用的静态方法

*实例工厂方法

配置文件配置好,其余同

eg:<bean id="c2" class="java.util.GregorianCalendar" /> //factory-method属性:要调用的实例方法

<bean id="time1" factory-bean="c2" factory-method="getTime"/> //factory-bean属性:要调用的对象的id

4)生命周期的管理

*初始化

init-method属性:指定初始化方法 容器在创建好相应的实例之后,会立即调用该实例的初始化方法

*销毁

destroy-method属性:指定销毁方法 容器在删除实例之前,会调用该实例的销毁方法

注:只有当作用域为singleton(单例)时,销毁方法才会执行

5)作用域

*默认情况下,对于一个bean,spring容器只会创建一个实例

*scope属性:指定作用域,缺省值是 "singleton(单例)",

若值为 "prototype(原型)",则每getBean一次,会创建一个新的实例

6)延迟加载

*spring容器启动后,会扫描整个配置文件,然后将单例的bean先创建好

*若希望只有当getBean时才创建,可以延迟加载

*lazy-init属性:若值为true,表示延迟加载,即容器启动之后不会创建实例,只有当getBean时才会创建

3.spring IOC

1)IOC(控制反转)定义

对象之间的依赖关系交给容器来管理

2)DI(依赖注入)定义

容器通过调用对象的构造器或者set方法来建立对象之间的依赖关系

注:IOC是一种思想,DI是实现IOC的主要技术途径

3)DI的两种方法

*set方法 容器调用对象的set方法来建立对象之间的依赖关系

a.有无参构造器

b.有set方法

c.在配置文件中使用<property name="具体哪个set方法" ref="set方法参数"/>配置

name属性:要注入的属性名称 ref属性:要注入的对象的id

*构造器 容器调用对象的构造器来建立对象之间的依赖关系

a.有带参构造器

b.在配置文件中使用<constructor-arg index="具体哪个带参构造器" ref="带参构造器参数"/>配置

index属性:从0开始,指定参数的位置(即要给第几个参数赋值)

4)自动装配

*默认情况下,容器是禁止自动装配的

*如要自动装配,必须设置autowire=以下三个值:

a.byName:查找id为(成员)属性名称的bean,然后调用set方法完成注入

需要有无参构造器,有set方法

b.byType:查找与(成员)属性类型一致的bean,然后调用set方法完成注入

需要有无参构造器,有set方法 如果找到多个,会出错

c. constructor:查找与属性类型一致的bean,然后调用构造器完成注入

需要有对应的构造器

*自动装配尽量少用,若要用,可使用byName

5)spring容器注入基本类型的值

*<property name="name" value="张三"></property>

*<property name="age"><value>25</value></property>

6)spring容器注入集合( List Set Map Properties )

*List/Set注入:<list><value>北京</value><value>上海</value></list>

*Map注入:<map><entry key="Java" value="90"></entry><entry key="C++" value="85"></entry></map>

*Properties 注入:<props><prop key="user">Tome</prop><prop key="password">123456</prop></props>

*将集合类型当做一个bean来配置

<util:list id="cityList"><value>香港</value><value>澳门</value></util:list>

在bean中 <property name="cities" ref="cityList"></property>来引用配置好的集合

其余集合类似

7)spring表达式 用来读取bean的属性值,语法上类似EL表达式

*<property name="name" value="#{eb1.name }"/> //读取id为eb1的bean的name属性值

*<property name="city" value="#{eb1.cities[1] }"/> //读取id为eb1的bean的cities属性,该属性是一个List,读取下标为1的元素的值

*<property name="score" value="#{eb1.scores.Java}"/>
//读取id为eb1的bean的scores属性值,该属性是一个Map,读取的key为Java的值

*读取location属性指定位置的文件的内容,并将内容存放到Properties对象中

<util:properties id="config" location="classpath:config.properties"></util:properties>

<property name="pageSize" value="#{config.pageSize }"></property>

8)使用注解

*配置组件扫描

容器会扫描base-package指定的包及其子包下面的所有的类,如果该类前面有特定的注解(如@Component),

则容器将其纳入,进行管理(相当于在配置文件中,有一个bean)

<context:component-scan base-package="要扫描的包名"/>

*@Component 通用注解 @Repository 持久化层组件注解

@Service 业务层组件注解 @Controller 控制层组件注解

*获得对象:同bean 默认的id是首字母小写之后的类名 可在注解后边自定义id名

*生命周期相关注解:@PostConstruct 指定初始化方法 @PreDestroy 指定销毁方法

*作用域相关注解(@Scope): "singleton"单例(默认) "prototype" 多例

*延迟加载相关注解(@Lazy):默认为false 表示不延迟加载 true表示延迟加载

*依赖注入的注解:

a.构造器/set方法注入:

@Autowired //声明需要为其注入bean

@Qualifier("id") //指定要注入的bean的id

b.set方法注入:@Resource (name="id") //name属性指定要注入的bean的id

*注入spring表达式/基本类型的值的注解:@Value("")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: