1、spring概述
spring是一个开源的设计层面框架,解决的是业务逻辑和其他各层的松耦合问题,
因为他将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量
级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
spring框架由很多模块组成,IOC、AOP、spring MVC、spring事务等,
当然spring也可以整合其他框架例如:mybatis、shiro等。
2、spring IOC
在java程序中,一个业务逻辑的实现往往需要多个对象来协作完成。在程序中我们使
用new Object()的方式创建对象,并且还要维护对象之间的相互依赖创建。所谓IOC(Inve
rsion of Control,控制反转),对于spring框架来说,就是由spring来负责控制对象的生
命周期以及对象之间的关系。对象的创建、销毁,对象之间的相互依赖关系都由spring来完
成,对象只需要关心业务逻辑本身就可以了。控制反转就是获得依赖对象的方式反转了。
2、1
--需要的jar包
--spring-core-4.3.5.RELEASE.jar
--spring-beans-4.3.5.RELEASE.jar
--spring-context-4.3.5.RELEASE.jar
--spring-logging-4.3.5.RELEASE.jar
--spring-expression-4.3.5.RELEASE.jar
2、2
创建spring配置文件
新建spring配置文件applicationContext.xml,该文件为spring配置的默认名,也可以
自己起名字。
<?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
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
</beans>
2、3测试
@Test
public void testInitContext(){
String conf = "applicationContext.xml";
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(conf);
System.out.println(applicationContext);
}
3 spring容器创建JavaBean
1、在applicationContext.xml中添加bean对象创建声明
<!-- 用构造器来实例化bean -->
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"></bean>
1.2、获得bean
@Test
public void testInitContext(){
//1.实例化spring容器
String conf = "applicationContext.xml";
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(conf);
//2.获得容器创建的bean实例
UserDao userDao =
(UserDao)applicationContext.getBean("userDao");
userDao.create();
}
1.3、bean属性注入
1、以构造方法的方式注入属性
<bean id="user" class="com.ztd.springdemo.demo01.User">
<constructor-arg name="account" value="admin"/>
<constructor-arg name="username" value="管理员"/>
</bean>
注意:必须有这个构造方法才行,参数名与构造方法中的保持一致
2、以set方法的方式注入属性
<bean id="user" class="com.ztd.springdemo.demo01.User">
<property name="account" value="admin"/>
<property name="username" value="管理員"/>
</bean>
注意:必须要有无参构造器方法和对应的getter/setter方法
3、对象类型的属性的注入
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
init-method="init" destroy-method="destory" scope="singleton" />
<bean id="userService" class="com.ztd.springdemo.demo01.UserService">
<!-- ref属性:引用另一个bean的id或name -->
<property name="userDao" ref="userDao"></property>
</bean>
1.3、bean标签属性介绍
1、bean的创建模式
scope属性指定了bean的创建模式
--singleton:单利的,默认的,只创建一个对象,调用getbean方法获取到的
是同一个对象
--prototype多例的,每次调用getbean方法获取的对象是从新创建的
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
scope="prototype"/>
2、bean初始化和销毁的回调方法
init-method属性指定的方法,在bean创建后自动调用
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
init-method="init"/>
destory-method属性指定的方法,在bean销毁前自动调用
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
destroy-method="destroy"/>
3、bean初始化时间
lazy-init属性指定了bean的创建时间
false:spring容器创建时就创建该bean
true:使用该bean时创建
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
lazy-init="true"/>
4 spring自动组件扫描
一般在xml配置文件中,声明一个bean或组件,spring容器会检测和注册该bean或组件。
除了这种方式之外,spring还支持自动扫描bean或组件,这样就不必再在xml文件中繁琐的
声明bean或组件。
4.1、在applicationContext.xml中指定扫描类的路径
<context:component-scan base-package="com.ztd.springdemo.demo02"/>
如上注解会自动扫描com.ztd.springdemo.demo02包及其子包下所有组件类
4.2、使用注解标注类
指定了扫描路径后并不是该路径下所有类都会被spring容器实例化注册,只是在类上加上
指定的注解标记时spring容器才会实例化注册。
@Component 通用注解
@Repository 持久化层组件注解
@Service 业务层组件注解
@Controller 控制层组件注解
以上注解目前功能是一样,为了让标注类本身的用途看起来更清晰。
import org.springframework.stereotype.Component;
@Component
public class UserDao {
public void create(){
System.out.println("创建了一个user");
}
}
默认bean名字为类名首字母小写,如需自己指定bean的名字,使用如下方式
@Component(“bean名字”)
@Component("userDao")
public class UserDaoImpl implements UserDao{
public void create(){
System.out.println("创建了一个user");
}
}
4.2、bean属性注入
1、 @Value 用于注入普通类型的属性
@Value(“admain”)
private String account;
2、@Autowried 自动装配,是spring的注解
默认按照类型注入
若按名子注入则需要加@Qualifier强制使用名字注入
@Autowried
@Qualifier("userDaoImpl")
private UserDao;
3、@Resource 是JavaEE的注解
先按照名字注入,找不到,则按照类型
如需指定名字@Resource(name="bean名字")
@Resource(name="userDaoImpl")
private UserDao userDao;
4.3 指定bean的创建模式
默认为单利模式,如需多例@Scope(“prototype”)
@Component
@Scope("prototype")
public class UserService {
}
4.4、指定bean初始化和销毁的回调方法
bean初始化后的方法@PostConstruct
bean销毁前执行的方法@PreDestroy
@PostConstruct
public void init(){
System.out.println("userDao 創建");
}
@PreDestroy
public void destroy(){
System.out.println("userDao 銷毀");
}
5、spring在web应用中的使用
1、加入spring-web-*jar
2、在web.xml中加入
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web,context.ContextLoaderlistener</listener-class>
<listener>
3、从servletContext中获取spring容器实例
ServletContext sc = getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);