一文搞懂Spring(一)
大家好,我是璐画
看到这篇文章的小伙伴们,应该都学习过了spring了,那么你们真的把spring彻底搞懂了吗,还是说模棱两可呢,今天我带着大家来总结下spring
目录
1、简介
2、Ioc
2.1、Ioc概念
2.2、初体验Ioc
2.3、Bean的范围
2.4、Bean的创建方式
2.5、Bean的依赖注入
2.6、Bean依赖注入类型
3、未完待续
1、简介
Spring是为了简化企业级Java开发而诞生的,spring可以让JavaBean之间有效解耦,可以说是企业开发必备,而初学者需要掌握spring一下四个功能
*Ioc
*Aop
*事务
*JdbcTemplate
那么下面由我带着大家去整理下我们所学
2、Ioc
2.1、Ioc概念
Ioc,中文翻译过来为控制反转,这是一个概念,也是一种思想,指的是对象控制权反转,下面举一个例子去说明
public class UserService{ private UserDao userDao = new UserDao(); //添加一个用户 public void save(..){ userDao.save(..); }}
在这段代码中,service需要调用dao去实现对数据库的操作时,我们不得不去手动的创建一个dao对象,也就是说,如果我们需要一个对象时,不得不去手动创建,初始化,销毁。如果这个时候,有人能够帮助我们去管理对象的创建,初始化,销毁,那么该多好啊。
而恰好spring的Ioc就是干这个的
下面通过一个例子来看下Ioc的使用吧
2.2、初体验Ioc
首先,需要创建一个Maven工程,然后去导入我们所需要的依赖
5.0.5.RELEASE <!-- 导入 spring 的 context 坐标, context 依赖 core 、 beans 、 expression--> org.springframework spring-context ${spring.version}
编写dao接口和实现类
public interface UserDao(){
public void save();
}
public class UserDaoImpl implements UserDao{
@Override
public void save(){
sout(“Hello World”);
}
}
配置spring核心配置文件,在resources下创建applicationContext.xml配置文件(这一,要先导入左边,如不然没有spring配置文件模板)
<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.xsd" > <bean id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" >
使用spring的API获得实例
@Test public void test1 (){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext ( "applicationContext.xml" ); UserDao userDao = ( UserDao ) applicationContext . getBean ( "userDao" ); userDao . save (); } //如果看到控制台打印出HelloWorld,那么说明创建实例成功,我们成功的让spring帮我们创建了userDao对象,并将对象放到容器内。
2.3、Bean的范围
在上面的例子中,我们用了spring的API根据id来创建出userDao对象,那么接下来我们详细说下创建对象这回事
首先,bean是交给spring创建的,而spring默认是根据类的无参构造利用反射创建的,那么就是说如果没有无参构造,那么对象就不能创建成功。
基本属性:
id:bean在spring容器中的唯一标识
class:bean的全限定名
bean的范围配置
scope: 指对象的作用范围,取值如下 singleton 默认值,单例的 prototype 多例的 request WEB 项目中, Spring 创建一个 Bean 的对象,将对象存入到 request 域中 session WEB 项目中, Spring 创建一个 Bean 的对象,将对象存入到 session 域中 global session WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么 globalSession 相当于
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="singleton">
当scope为singleton是,那么会有如下
bean的实例化个数:1个
bean的创建时机:配置文件加载,容器被创建时
生命周期
创建:容器创建时,对象被创建
运行:只要容器在,对象就一直存活
销毁:当容器销毁时,对象销毁
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="prototype">
当scope为singleton是,那么会有如下
bean的实例化个数:多个
bean的创建时机:使用getBean时,对象被创建
生命周期
创建:当使用对象时,对象被创建
运行:只要对象被使用,对象就一直存活
销毁:当对象长时间不使用时,jvm垃圾回收机制将对象销毁
2.4、Bean的创建方式
1)无参构造方法创建
根据无参构造去创建类的对象,默认使用这种方式,如果该类没有无参构造,创建对象失败
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl">
2)工厂静态方法创建
public class Factory{
public static UserDao createFactory(){
return new UserDaoImpl();
}
}
<bean id="userDao" class="com.itcast.Factory" factory-method="createFactory">
3)工厂实例方法创建
public class DynamicFactoryBean { public UserDao createUserDao (){ return new UserDaoImpl (); } } <bean id = "factoryBean" class = "com.itcast.factory.DynamicFactoryBean" /> <bean id = "userDao" factory-bean = "factoryBean" factory-method = "createUserDao" />
4)配置类创建
@Configurationpublic class Config { @Bean public UserDao createUserDao(){ return new UserDaoImpl(); }}
注意,通过配置类方式注入,创建出的对象唯一标识,就是方法名,比如上面例子中对象标识为(createUserDao),如果想指定标识,可以在上面@Bean中指定,这里就不介绍了
5)自动创建
spring提供了一些注解,在类上写上这些注解就可以实现自动创建
@Component@Controller@Service@Repository这几个注解没有本质上的区别,其他三个都是基于@Component创建的,为了用于类的区分
在service层上使用@Service
在dao层上使用@Repository
在controller层上使用@Controller
2.5、Bean的依赖注入
虽然说,上面我们已经将对象的创建权交给了spring,但是也只是省去我们手动管理对象的麻烦,对象之间不免会存在依赖的问题,比如,业务层中需要持久层的调用,而spring的Ioc核心就是依赖注入,可以这么说我们只需要将它们的依赖关系配置给spring,我们就可以坐等spring把持久层对象注入到业务层中
1)构造器注入
<bean id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" /> <bean id = "userService" class = "com.itcast.service.impl.UserServiceImpl" > <constructor-arg name = "userDao" ref = "userDao" >
2)set方法注入
在UserService中写入
public class UserServiceImpl implements UserService { private UserDao userDao ; public void setUserDao ( UserDao userDao ) { this . userDao = userDao ; } @Override public void save () { userDao . save (); } }
配置
<bean id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" /> <bean id = "userService" class = "com.itcast.service.impl.UserServiceImpl" > <property name = "userDao" ref = "userDao" />
2.6、Bean依赖注入类型
上面的操作,都是注入的引用 Bean ,处了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注 入。 注入数据的三种数据类型 普通数据类型 引用数据类型
集合数据类型
其中引用数据类型,此处就不再赘述了,之前的操作都是对 UserDao 对象的引用进行注入的,下面将以 set 方法注入为例,演示普通数据类型和集合数据类型的注入。 1)普通数据类型
public class UserDaoImpl implements UserDao { private String company ; private int age ; public void setCompany ( String company ) { this . company = company ; } public void setAge ( int age ) { this . age = age ; } public void save () { System . out . println ( company + "===" + age ); System . out . println ( "UserDao save method running...." ); } }
<bean id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" > <property name = "company" value = "璐画 " > <property name = "age" value = "18" >
2)集合数据类型 (List)
public class UserDaoImpl implements UserDao { private List < String > strList ; public void setStrList ( List < String > strList ) { this . strList = strList ; } public void save () { System . out . println ( strList ); System . out . println ( "UserDao save method running...." ); } }
<bean id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" > <property name = "strList" > aaa bbb ccc
3)集合数据类型注入(map)
public class UserDaoImpl implements UserDao { private Map < String , User > userMap ; public void setUserMap ( Map < String , User > userMap ) { this . userMap = userMap ; } public void save () { System . out . println ( userMap ); System . out . println ( "UserDao save method running...." ); } }
<bean id = "u1" class = "com.itcast.domain.User" /> <bean id = "u2" class = "com.itcast.domain.User" /> <bean id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" > <property name = "userMap" >
4)集合数据类型(properties)
public class UserDaoImpl implements UserDao { private Properties properties ; public void setProperties ( Properties properties ) { this . properties = properties ; } public void save () { System . out . println ( properties ); System . out . println ( "UserDao save method running...." ); } }
<bean id = "userDao" class = "com.itheima.dao.impl.UserDaoImpl" > <property name = "properties" > <prop key = "p1" > aaa <prop key = "p2" > bbb <prop key = "p3" > ccc
3、未完待续
以上就是spring的Ioc基础部分,下文更新Aop基础