老规矩:
前几篇文章介绍了bean管理的一些的基本操作,但是呢这些的操作对与没有框架的程序来说是简便了些,但对于大型的程序来说,就有所繁琐,从这篇博客开始主要介绍更加简便的方法。本篇文章从创建对象这一基本步骤来说。如果对于前面关于Spring的文章没有了解,建议去主页浏览一下基本的操作。
之前介绍了创建对象的集中方法,接下来通过注解的方法来创建对象。
什么是注解,可能有点不懂但是说到注释,你可能就能明白了,那注释等于注解吗?答案是否定的但是结构没有太大的区别。注解也拥有特殊符号。
注解就是代码拥有的特殊标记,
spring当中那些代码提供注解作用:
注意:上面的四个的作用都是一样的,都可以创建实例对象等。
代码实现:下面代码创建的注解是通过Component来实现的,其他的三个也可以只需要把Component名称改换另外的三个即可。
- import org.springframework.stereotype.Component;
- @Component (value = "d1") //提供注解的代码
- public class demo1 {
- public void play(){
- System.out.println("看看我是否输出");
- }
- }
配置文件:
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:context="http://www.springframework.org/schema/context"
- 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
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
-
- <context:component-scan base-package="new_study.comment,new_study.java_file">context:component-scan>
-
- beans>
注意配置文件中的地址发生的变化,下面位置介绍配置文件的属性名称代表的具体含义
因为XML文档都有格式,为了spring的配置文件增加的节点能满足要求、合法,所以引入校验该xml的格式文件。
xmlns是xml命名空间的意思,而xmlns:xsi是指xml所遵守的标签规范。
1.xmlns:关于初始化bean的格式文件地址
2.xmlns:xsi:辅助初始化bean
3.xsi:context:关于spring上下文,包括加载资源文件
4.xsi:schemaLocation:用于声明了目标名称空间的模式文档
测试类:
注意:测试类和之前的没有太大的变化,但是因为配置的变化有一点注意到getbean方法中获取的name名改为创建注解是设置的名称
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
- public class testdemo {
- @Test
- public void play(){
- ApplicationContext context = new ClassPathXmlApplicationContext("new_study/comment/create/bean.xml");
- demo1 demo1 = context.getBean("d1",demo1.class);
- demo1.play();
- }
- }
输出结果:
上面的步骤完成了注解的基本构造和实现的方法,但是这里面还有一大问题就是在你扫描的位置拥有很多的类,这样忙目的扫描可能会占用更大的内存,接下来介绍一种配置代码,可以修改你扫描类型
代码一:
- <context:component-scan base-package="com.atguigu" use-defaultfilters="false">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- context:component-scan>
-
代码二:
- <context:component-scan base-package="com.atguigu">
- <context:exclude-filter type="annotation"
-
- expression="org.springframework.stereotype.Controller"/>
- context:component-scan>
-
-
属性注解标记:
- @Service
- public class class1 {
- public void add(){
- inter1 inter1 = new class2();
-
- inter1.add();
- System.out.println("bbbbbbbbbbbbbb");}
- public static void main(String[] args) {
- class1 class1 = new class1();
- class1.add();
- }
-
- }
- @Service
- class class2 implements inter1{
- public void add(){
- System.out.println("aaaaaaaaaaaaaaaaaaa");
- }
-
- }
- interface inter1{
- public void add();
- }
上面阐述的代码是基础实现的代码,接下来通过注解的方式来实现注入属性,框架是需要通过配置文件来进行实现·
- @Service
- public class class1 {
- @Autowired //这是属性注解标记
- private inter1 inter1;
- public void add(){
- inter1.add();
- System.out.println("bbbbbbbbbbbbbb");
- }
-
- }
- @Service
- class class2 implements inter1{
- public void add(){
- System.out.println("aaaaaaaaaaaaaaaaaaa");
- }
-
- }
- interface inter1{
- public void add();
- }
主页上有关于spring的专栏可以进详细的了解
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:context="http://www.springframework.org/schema/context"
- 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
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
-
- <context:component-scan base-package="new_study.comment,new_study.java_file">context:component-scan>
-
- beans>
测试类:
- @Test
- public void play2(){
- ApplicationContext context = new ClassPathXmlApplicationContext("new_study/comment/create/bean2.xml");
- class1 class1 = context.getBean("class1",class1.class);
- class1.add();
- }
配置文件和测试类在之前的博客中有代码的介绍,看不懂的可以去主页了解一下
(注意:@Qualifier需要与Autowired连用:因为接口可以拥有很多的实现类,而当我们需要一个具体类的实现方法时,@Autowired是没有办法去实现的·而@Qualifier可以很好的解决这个问题,因为@Qualifier是通过名称来注入的,可以通过名称直接定位到需要的类中
- package new_study.comment.create;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.stereotype.Service;
-
- //通过注解的方式向属性自动装配值
- @Service
- public class class1 {
- @Autowired //使用注解的方式来注入减少代码
- @Qualifier(value = "mm")//定义接口实现类的位置
- private inter1 inter1;
- public void add(){
- inter1.add();
- System.out.println("bbbbbbbbbbbbbb");
- }
-
- }
- @Service(value = "myc") //接口实现类一
- class class2 implements inter1{
- public void add(){
- System.out.println("aaaaaaaaaaaaaaaaaaa");
- }
-
- }
- interface inter1{
- public void add();
- }
- @Service(value = "mm") //接口实现类二
- class demo3 implements inter1{
- public void add(){
- System.out.println("ccccccccccc");
- }
- }
上述代码中有两个接口实现类,可以通过创建对象来定义名称,再通过@Qualifier:来向实现类进行选择。
@Resource //根据类型进行注入用法和Autowired:一致
@Resource(name = "userDaoImpl1") //根据名称进行注入 用法和@Qualifier:差不多但有不同,它不要同Autowired:联用可以单独使用
- //@Resource //根据类型进行注入
- @Resource(name = "userDaoImpl1") //根据名称进行注入
- @Value(value = "abc")
-
- private String name;
上面介绍了配置扫描类型的细节问题,和自动装配的实现代码,不要小看这几行代码,在真正的项目中蕴含巨大的作用,细节决定成败
接下来spring-ioc-bean管理中的完全注解开发
什么是完全注解开发:用类去替代配置文件,通过用完全注解标记的方法去实现开发
配置类:
- @Configuration //把当前类作为配置类,去替代配置文件
- @ComponentScan(basePackages = "new_study.comment.create") //它的作用就是xml配置文件中的那行代码
- public class xml {
- }
测试类:
- public void play2(){
- ApplicationContext context = new AnnotationConfigApplicationContext(xml.class);
- class1 class1 = context.getBean("class1",class1.class);
- class1.add();
- }
- //代码几乎没有改变,改变的是AnnotationConfigApplicationContext(xml.class):注解对象xml.class则为上述配置的配置类
完全注解开发方式,可以减少配置使步骤更加的节约,代码执行更加的顺畅,上述代码是发生改变的地方,其他的代码前文都有介绍。