大家好,我是璐画
看到这篇文章的小伙伴们,应该都学习过了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、未完待续
Spring是为了简化企业级Java开发而诞生的,spring可以让JavaBean之间有效解耦,可以说是企业开发必备,而初学者需要掌握spring一下四个功能
*Ioc
*Aop
*事务
*JdbcTemplate
那么下面由我带着大家去整理下我们所学
Ioc,中文翻译过来为控制反转,这是一个概念,也是一种思想,指的是对象控制权反转,下面举一个例子去说明
public class UserService{ private UserDao userDao = new UserDao(); //添加一个用户 public void save(..){ userDao.save(..); } }
在这段代码中,service需要调用dao去实现对数据库的操作时,我们不得不去手动的创建一个dao对象,也就是说,如果我们需要一个对象时,不得不去手动创建,初始化,销毁。如果这个时候,有人能够帮助我们去管理对象的创建,初始化,销毁,那么该多好啊。
而恰好spring的Ioc就是干这个的
下面通过一个例子来看下Ioc的使用吧
首先,需要创建一个Maven工程,然后去导入我们所需要的依赖
5.0.5.RELEASE 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配置文件模板)
xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation = "http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd" >id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" >
使用spring的API获得实例
@Testpublic void test1 (){ApplicationContext applicationContext = new ClassPathXmlApplicationContext ( "applicationContext.xml" );UserDao userDao = ( UserDao ) applicationContext . getBean ( "userDao" );userDao . save ();}//如果看到控制台打印出HelloWorld,那么说明创建实例成功,我们成功的让spring帮我们创建了userDao对象,并将对象放到容器内。
在上面的例子中,我们用了spring的API根据id来创建出userDao对象,那么接下来我们详细说下创建对象这回事
首先,bean是交给spring创建的,而spring默认是根据类的无参构造利用反射创建的,那么就是说如果没有无参构造,那么对象就不能创建成功。
基本属性:
id:bean在spring容器中的唯一标识
class:bean的全限定名
bean的范围配置
id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="singleton"> 当scope为singleton是,那么会有如下
bean的实例化个数:1个
bean的创建时机:配置文件加载,容器被创建时
生命周期
创建:容器创建时,对象被创建
运行:只要容器在,对象就一直存活
销毁:当容器销毁时,对象销毁
id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="prototype"> 当scope为singleton是,那么会有如下
bean的实例化个数:多个
bean的创建时机:使用getBean时,对象被创建
生命周期
创建:当使用对象时,对象被创建
运行:只要对象被使用,对象就一直存活
销毁:当对象长时间不使用时,jvm垃圾回收机制将对象销毁
1)无参构造方法创建
根据无参构造去创建类的对象,默认使用这种方式,如果该类没有无参构造,创建对象失败
id="userDao" class="com.itcast.dao.impl.UserDaoImpl">
2)工厂静态方法创建
public class Factory{
public static UserDao createFactory(){
return new UserDaoImpl();
}
}
id="userDao" class="com.itcast.Factory" factory-method="createFactory">
3)工厂实例方法创建
public class DynamicFactoryBean {public UserDao createUserDao (){return new UserDaoImpl ();}}id = "factoryBean" class = "com.itcast.factory.DynamicFactoryBean" /> id = "userDao" factory-bean = "factoryBean" factory-method = "createUserDao" />
4)配置类创建
@Configuration public class Config { @Bean public UserDao createUserDao(){ return new UserDaoImpl(); } }
注意,通过配置类方式注入,创建出的对象唯一标识,就是方法名,比如上面例子中对象标识为(createUserDao),如果想指定标识,可以在上面@Bean中指定,这里就不介绍了
5)自动创建
spring提供了一些注解,在类上写上这些注解就可以实现自动创建
@Component @Controller @Service @Repository这几个注解没有本质上的区别,其他三个都是基于@Component创建的,为了用于类的区分
在service层上使用@Service
在dao层上使用@Repository
在controller层上使用@Controller
虽然说,上面我们已经将对象的创建权交给了spring,但是也只是省去我们手动管理对象的麻烦,对象之间不免会存在依赖的问题,比如,业务层中需要持久层的调用,而spring的Ioc核心就是依赖注入,可以这么说我们只需要将它们的依赖关系配置给spring,我们就可以坐等spring把持久层对象注入到业务层中
1)构造器注入
id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" /> id = "userService" class = "com.itcast.service.impl.UserServiceImpl" > name = "userDao" ref = "userDao" >
2)set方法注入
在UserService中写入
public class UserServiceImpl implements UserService {private UserDao userDao ;public void setUserDao ( UserDao userDao ) {this . userDao = userDao ;}@Overridepublic void save () {userDao . save ();}}
配置
id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" /> id = "userService" class = "com.itcast.service.impl.UserServiceImpl" > name = "userDao" ref = "userDao" />
集合数据类型
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...." );}}
id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" > name = "company" value = "璐画 " > 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...." );}}
id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" > 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...." );}}
id = "u1" class = "com.itcast.domain.User" /> id = "u2" class = "com.itcast.domain.User" /> id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" > name = "userMap" > key = "user1" value-ref = "u1" /> key = "user2" value-ref = "u2" />
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...." );}}
id = "userDao" class = "com.itheima.dao.impl.UserDaoImpl" > name = "properties" > key = "p1" > aaa key = "p2" > bbb key = "p3" > ccc
以上就是spring的Ioc基础部分,下文更新Aop基础