栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

spring IOC之注解

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring IOC之注解

式不一样。

1.开发环境搭建
  • 拷贝jar包到工程

所需jar包

  • 在类的根路径下创建一个任意名称的xml文件(不能是中文)
    给配置文件导入约束
    约束在spring-framework-4.2.4.RELEASEdocsspring-framework-referencehtmlxsd-configuration.html目录下的

约束

bean.xml


    

然后就可以开始使用注解了

2.常用注解

①用于创建bean对象

  • @Component
    作用:相当于配置了一个bean标签
    出现的位置:类上面
    属性:value。value的值是指定bean的id,当不写,默认值是当前类的短名首字母改小写

还是CustomerServiceImpl.java类

package com.edu.services.Impl;import com.edu.services.ICustomerService;import org.springframework.stereotype.Component;


@Component(value = "customerServiceImpl")
public class CustomerServiceImpl implements ICustomerService {

    @Override
    public void saveCustomer() {        System.out.println("执行了保存用户");
    }
}

配置bean.xml


    

用client.java测试

package com.edu.ui;import com.edu.services.ICustomerService;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client {    public static void main(String[] args){

        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        ICustomerService cs = (ICustomerService) ac.getBean("customerServiceImpl");
        cs.saveCustomer();
    }
}

运行结果

  • 由@Component注解衍生了一下三个注解,他们的作用及属性都是一模一样的。

    • @Controller
      一般用于表现层的注解。

    • @Service
      一般用于业务层的注解。

    • @Repository
      一般用于持久层的注解。

②用于注入数据

  • @Autowired
    作用:自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring容器查找,找到了也可以注入成功。找不到就报错。

CustomerServiceImpl.java

package com.edu.services.Impl;import com.edu.dao.ICustomerDao;import com.edu.services.ICustomerService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;


@Service(value = "customerServiceImpl")
public class CustomerServiceImpl implements ICustomerService {

    @Autowired
    private ICustomerDao customerDao = null;

    @Override
    public void saveCustomer() {        System.out.println("业务层调用持久层");        customerDao.saveCustomer();
    }
}

运行结果

  • @Qualifier
    作用:在自动按照类型注入的基础之上,再按照Bean的id注入。它在给类成员注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。
    属性:value,用于指定bean的id

  • @Resource
    作用:直接按照bean的id注入
    属性:name,用于指定的bean的id

以上三个注解都是用于注入其他的bean类型的。

  • @Value
    作用:用于注入基本类型和String类型。可以借助spring的el表达式读取properties文件中的配置。
    属性:value,用于指定要注入的数据。

CustomerServiceImpl.java

package com.edu.services.Impl;import com.edu.dao.ICustomerDao;import com.edu.services.ICustomerService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import javax.annotation.Resource;


@Service(value = "customerServiceImpl")
public class CustomerServiceImpl implements ICustomerService {

    @Value("你是猪")
    private String name;

    @Resource(name = "customerDaoImpl")
    private ICustomerDao customerDao = null;

    @Override
    public void saveCustomer() {        System.out.println("业务层调用持久层..."+name);        customerDao.saveCustomer();
    }
}

运行结果

③用于改变作用范围的

  • @Scope
    作用:指定bean的作用范围。
    属性:value,指定范围的值。
    value的取值:singleton  prototype request session globalsession

Client.java

package com.edu.ui;import com.edu.services.ICustomerService;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client {    public static void main(String[] args){

        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        ICustomerService cs = (ICustomerService) ac.getBean("customerServiceImpl");//        cs.saveCustomer();
        ICustomerService cs1 = (ICustomerService) ac.getBean("customerServiceImpl");
        System.out.println(cs == cs1);
    }
}

没改scope之前

运行结果

CustomerServiceImpl.java

package com.edu.services.Impl;import com.edu.dao.ICustomerDao;import com.edu.services.ICustomerService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Service;import javax.annotation.Resource;


@Service(value = "customerServiceImpl")
@Scope("prototype")
public class CustomerServiceImpl implements ICustomerService {

    @Value("你是猪")
    private String name;

    @Resource(name = "customerDaoImpl")
    private ICustomerDao customerDao = null;

    @Override
    public void saveCustomer() {        System.out.println("业务层调用持久层..."+name);        customerDao.saveCustomer();
    }
}

更改scope之后

IOC的注解已经完了,但是我们发现,即使有spring的注解,也依旧离不开xml配置文件,那么可不可以用注解代替xml配置文件呢,这就是spring的新注解。

3.spring的纯注解配置
  • 项目工程目录

工程结构

  • 用SpringConfiguration.java代替bean.xml

package com.edu.config;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;

@Configuration//表明当前类是一个配置类
@ComponentScan(basePackages = "com.edu")//配置要扫描的包
public class SpringConfiguration {
}
  • 测试类的Client.java就不能用bean.xml了

package com.edu.ui;import com.edu.config.SpringConfiguration;import com.edu.services.ICustomerService;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Client {    public static void main(String[] args) {        //1.获取容器:由于我们已经没有了xml文件,所以再用读取xml方式就不能用了。
        //这时需要指定加载哪个类上的注解
        ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);        //2.根据bean的id获取对象
        ICustomerService cs = (ICustomerService) ac.getBean("customerService");
        cs.saveCustomer();
    }
}

运行结果

新注解说明

  • @Configuration
    作用:
    用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.class)。
    属性:
    value:用于指定配置类的字节码

  • @ComponentScan
    作用:
    用于指定spring在初始化容器时要扫描的包。
    和xml配置文件中的作用一样
    属性:
    basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。

  • @PropertySource
    作用:
    用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。
    属性:
    value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:

  • @import
    作用:
    用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解。当然,写上也没问题。
    属性:
    value[]:用于指定其他配置类的字节码。

  • @Bean
    作用:
    该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。它就相当于我们之前在xml配置中介绍的factory-bean和factory-method。
    属性:
    name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。

运用新注解:

运用纯注解对customer进行增删改查

数据库结构

项目目录结构

需要的jar包



作者:乐乐亲么么哒
链接:https://www.jianshu.com/p/86a1ae3dde03


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/235536.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号