一文搞懂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
        
                 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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" >
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 相当于

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垃圾回收机制将对象销毁

2.4、Bean的创建方式

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

2.5、Bean的依赖注入

虽然说,上面我们已经将对象的创建权交给了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 ;
        }
        @Override
        public void save () {
                userDao . save ();
        }
}

配置

id = "userDao" class = "com.itcast.dao.impl.UserDaoImpl" />
id = "userService" class = "com.itcast.service.impl.UserServiceImpl" >
         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...." );
        }
}

 

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
                
        

 

3、未完待续

以上就是spring的Ioc基础部分,下文更新Aop基础

你可能感兴趣的:(Spring,spring,java,后端)