1.简介
以IOC(反转控制)和AOP(面向切面编程)为内核
spring结构:
spring开发简单的流程
① 导入坐标
② 创建Bean
③ 创建applicationContext.xml
④ 在配置文件中进行配置
⑤ 创建ApplicationContext对象getBean
2.spring配置文件
- bean标签的基本配置
用于配置对象交由Spring 来创建。
默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
基本属性:
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
- Bean标签范围配置
scope:指对象的作用范围,取值如下:
1)当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
2)当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
3.Bean的依赖注入
原先的写法
UserServiceImpl类中(业务层实现):
@Override
public void save() {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();
}
UserController类中(表现层):
public class UserController {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService =(UserService) app.getBean("userServiceImpl");
userService.save();
}
}
可以清晰地看到目前UserService实例和UserDao实例都存在与Spring容器中,当前的做法是在容器外部获得UserService实例和UserDao实例,然后在程序中进行结合
依赖注入的写法
UserServiceImpl类中(业务层实现):
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Override
public void save() {
userDao.save();
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
配置文件中:
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userServiceImpl" class="com.itheima.com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部。
Bean的依赖注入的数据类型
上面的操作是注入的引用bean,除了对象的引用可以注入,普通的数据类型、引用集合类等都可以在容器中进行注入。
普通数据类型的注入:
public class UserDaoImpl implements UserDao {
private String username;
private int age;
@Override
public void save() {
System.out.println(username+"====="+age);
System.out.println("save running......");
}
public void setUsername(String username) {
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
}
配置文件:
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="username" value="hongjinyuan"/>
<property name="age" value="21"/>
</bean>
简单小结
4.Spring配置数据源
配置数据源的作用
• 数据源(连接池)是提高程序性能如出现的
• 事先实例化数据源,初始化部分连接资源
• 使用连接资源时从数据源中获取
• 使用完毕后将连接资源归还给数据源
数据源开发步骤
① 导入数据源的坐标和数据库驱动坐标
② 创建数据源对象
③ 设置数据源的基本连接数据
④ 使用数据源获取连接资源和归还连接资源
5.Spring注解开发
spring是轻代码重配置的框架,配置非常繁重,影响开发效率,所以注解开发是一种趋势,注解替代xml配置文件可以做到简化配置,提高开发效率。
Spring原始注解
注意:使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法,相当于告诉spring哪些包下面的类使用了注解注入
<context:component-scan base-package="com.itheima"></context:component-scan>
原始注解的含义
- 使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化
- 使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化
- 使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入
注意:这里的实例化含义是将这个类实例(相当于new一个对象)然后放进spring容器里,而注入则是从容器中取出实例注入到这个变量中
-
使用@Value进行字符串的注入
-
使用@Scope标注Bean的范围 (例如单例:@Scope(“singleton”))
-
使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
-
-使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
Spring新注解的含义
(例如单例:@Scope(“singleton”))