JavaWeb: Spring框架学习2(注解)

1,使用Spring IOC与DI实现MVC的模拟例子: 

spring配置文件:通过set方法进行注入,其实就是使用快捷键生成set方法,首先建立对应的全局变量(特别简单)。

把类放到Spring容器中的目的是为了创建对象,所以接口不应该放到Spring容器中。

使用注解做权限比较流行。

    <!--让Spring容器帮助我们创建对象-->
    <!--注入PersonDaoImpl类-->
    <bean id="personDaoImpl" class="dao.PersonDaoImpl"/>

    <!--注入PersonServiceImpl,让Spring帮助我们创建对象-->
    <!--通过set方法对类中的属性进行赋值(属性的名称,好好理解这句话),因为属性是引用类型,所以使用ref-->
    <bean id="personServiceImpl" class="service.PersonServiceImpl">
        <property name="mPersonDaoImpl">
            <ref bean="personDaoImpl"/>
        </property>
    </bean>

    <!--personAction-->
    <bean id="personAction" class="PersonAction">
        <property name="mPersonService">
            <ref bean="personServiceImpl"/>
        </property>
    </bean>

测试Spring mvc

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:测试SpringMVC
 */
public class TestMvc {
    @Test
    public void testSpringMVC() {
        //已经可以执行成功了,实现了面向接口编程。
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        PersonAction mPersonAction = (PersonAction) context.getBean("personAction");
        mPersonAction.returnResult();
    }
}
Action层:

import service.PersonService;

/**
 * Created on 2017/9/1.
 * Author:crs
 * PersonAction层,通过spring实现mvc。
 */
public class PersonAction {
    private PersonService mPersonService;

    public PersonService getmPersonService() {
        return mPersonService;
    }

    public void setmPersonService(PersonService mPersonService) {
        this.mPersonService = mPersonService;
    }

    //获取查询的结果
    public void returnResult() {
        this.mPersonService.processLogic();
    }
}
service层:

package service;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:PersonService
 */
public interface PersonService {
    void processLogic();
}
package service;

import dao.PersonDaoImpl;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:PersonServiceImpl接口的实现类
 */
public class PersonServiceImpl implements PersonService {

    private PersonDaoImpl mPersonDaoImpl;

    public PersonDaoImpl getmPersonDaoImpl() {
        return mPersonDaoImpl;
    }

    public void setmPersonDaoImpl(PersonDaoImpl mPersonDaoImpl) {
        this.mPersonDaoImpl = mPersonDaoImpl;
    }

    public void processLogic() {
        //调用dao层的方法,返回想要的结果。
        this.mPersonDaoImpl.insertData();
    }
}
dao层:

package dao;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:PersonDao 数据操作接口
 */
public interface PersonDao {
    void insertData();
}
package dao;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:
 */
public class PersonDaoImpl implements PersonDao {
    public void insertData() {
        System.out.println("插入数据成功!");
    }
}

2,自定义注解以及自定义注解解析器 

package testAnnotation;

import java.lang.annotation.*;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:自定义类注解
 */
@Documented //此注解可以出现在帮助文档中
@Target(ElementType.TYPE)  //此注解可以用在类上面
@Retention(RetentionPolicy.RUNTIME) //此注解编译和运行时发挥作用
public @interface ClassDescription {
    //此注解存在一个String类型的value属性
    String value();
}
package testAnnotation;

import java.lang.annotation.*;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:自定义一个使用在方法上的注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodDescription {
    String name();
}
使用自定义注解:

package testAnnotation;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:测试自定义注解
 */
@ClassDescription("自己定义一个注解")
public class Test {
    @MethodDescription(name = "自定义一个方法注解")
    public void testJava() {
        System.out.println("这是java学科!");
    }
}
自定义注解解析器:

package testAnnotation;

import java.lang.reflect.Method;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:新建注解解析器,解析自定义注解
 * 通过反射的方式,获取注解中的值
 */
public class ParseAnnotation {
    @org.junit.Test
    public void testParse() {
        //获取类的字节码文件
        Class<Test> testClass = Test.class;
        //如果字节码文件中存在类注解
        if (testClass.isAnnotationPresent(ClassDescription.class)) {
            //获取此注解
            ClassDescription annotation = testClass.getAnnotation(ClassDescription.class);
            //打印注解的值
            System.out.println(annotation.value());
        }
        //获取字节码文件中的方法集合
        Method[] methods = testClass.getMethods();
        for (Method method : methods) {
            if (method.isAnnotationPresent(MethodDescription.class)) {
                MethodDescription annotation = method.getAnnotation(MethodDescription.class);
                System.out.println(annotation.name());
            }
        }
    }
}

3,Spring中的注解:@Resource注解

在Spring中,IOC与DI都有对应的注解,每个注解都用特定的用途。
分析注解使用的整个过程:
1、当Spring容器启动的时候,spring容器加载了配置文件
2、在Spring配置我呢间中,如果遇到<bean>的配置,就会为该类创建对象
3、在Spring容器的范围内查找bean,看哪些bean的属性上有@Resource注解
4、找到@Resource注解以后,判断该注解的属性是否为“”(name没有写)
如果没有写name属性,就会让属性的字段名称和bean中的id值进行匹配,如果匹配成功则赋值。
如果匹配不成功,就会按照属性类型来进行匹配;如果匹配不成功,就会报错。
如果有name属性,就会按照name属性的值和bean的id值进行匹配,如果匹配成功就赋值,匹配不成功就会报错。

@Autowired注解,应用于字段上,按照类型来进行装配对象,默认情况下它要求依赖对象必须存在
如何使用一个注解把类放到Spring容器中:类扫描注解解析器,普通的注解解析器

package springAnnotation;

import javax.annotation.Resource;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:Person
 */
public class Person {
    @Resource(name = "student")
    private Student student;

    public void testShowStudent() {
        student.sayHello();
    }
}

package springAnnotation;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created on 2017/9/1.
 * Author:crs
 * Description:测试SpringAnnotation
 * 如何进行Spring注解配置,让Spring容器支持注解的使用:导入命名空间,导入注解解析器<context:annotation-config></context:annotation-config>
 * 基本数据类型不能使用注解,只有引用类型才能使用注解。
 *
 * @Resource注解的使用规则:
 * 1)在配置文件中,进行注解配置,导入命名空间。
 * 2)导入注解解析器
 * 3)一般应用于类的属性上;该注解有一个name属性,默认为“”;
 */
public class TestSpringAnnotation {
    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Person person = (Person) context.getBean("person");
        person.testShowStudent();
    }
}

Spring注解配置文件:

   xmlns:context="http://www.springframework.org/schema/context"
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd
    <!--让Spring容器支持注解的使用-->
    <context:annotation-config></context:annotation-config>
    <!--测试Spring注解-->
    <bean id="student" class="springAnnotation.Student"/>
    <bean id="person" class="springAnnotation.Person"/>

4,类扫描注解解析器的使用规则:(需要进行扫描两次,@Component和@Resource)

作用:使用Spring注解完成bean的定义,不需要在xml文件中配置bean。

@Component的使用:只需要在对应的类上加上一个@Component注解,就将该类定义为一个Bean了。但是使用注解只能使用默认的构造函数创建对象。
定义bean时,id的值为类名,并且把第一个字母变成小写(规范)。

1)在spring的配置文件中导入命名空间

2)导入注解解析器;该注解解析器有两个功能:类扫描和依赖注入;在base-package包以及子包下查找所有的类

    <!--类扫描注解解析器-->
    <context:component-scan base-package="springAnnotation"/>

3)如果一个类上添加了@Component注解,就会进行如下的匹配

如果其value值的属性为"";

@Component
public class Person {
    //这种注入bean的方式含义是:(@Component注解等价于下面这句话)
    //<bean id="person" class="Person"/>
}
如果其value值的属性不为空;

@Component("a")
public class Person {
    //这种注入bean的方式含义是:(@Component注解等价于下面这句话)
    //<bean id="a" class="Person"/>
}

4)再次按照@Resource的法则进行匹配。

使用xml文件进行配置bean与使用注解进行配置bean的比较:

使用xml配置书写比较麻烦,但是效率高,不用多次扫描;使用注解进行配置书写简单,但是效率低。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot是一个开源的Java框架,可以快速构建基于Spring框架的应用程序。Spring Boot的主要目标是简化和加速Spring应用程序的开发过程,它通过自动配置和约定优于配置的方式来减少开发人员的工作量。Spring Boot集成了大量常用的第三方框架和工具,如Tomcat、Jackson、Hibernate、MyBatis等,这些框架和工具都可以通过Spring Boot的starter依赖来快速集成到应用程序中。 Spring Boot的优点包括: 1. 简化配置:Spring Boot通过自动配置来减少开发人员的配置工作量。 2. 快速开发:Spring Boot提供了大量的starter依赖,可以快速集成第三方框架和工具。 3. 易于部署:Spring Boot应用程序可以直接打包成一个可执行的jar包,方便部署和运行。 4. 微服务支持:Spring Boot对微服务的支持非常好,可以快速构建分布式系统。 5. 集成测试支持:Spring Boot提供了很多测试工具和注解,方便进行集成测试。 总之,Spring Boot是一个非常优秀的Java框架,可以大大提高开发效率和代码质量,推动Java生态圈的发展。 ### 回答2: Spring Boot框架是一种用于构建独立的、基于Java的Web应用程序的框架。它基于Spring框架,并通过自动化配置、约定优于配置和快速启动的特性,使得开发者可以更加简单、快速地搭建起一个高度可定制和可扩展的应用程序。 Spring Boot提供了很多功能和特性,使得开发人员可以专注于业务逻辑,而无需去处理框架的基本配置。它包括自动配置、起步依赖、命令行界面等一系列工具,可以减少开发时间和配置工作。同时,Spring Boot还提供了健康监测、性能监测、安全性等重要功能,使得应用程序更加健壮和安全。 Spring Boot的优点包括: 1. 便捷的配置:Spring Boot通过自动配置和约定优于配置的原则,可以轻松地进行配置,减少开发者的工作量。 2. 快速启动:Spring Boot使用内嵌的Web容器,无需额外的配置和安装,可以快速启动应用程序并进行开发和测试。 3. 高度可定制和可扩展:Spring Boot提供了大量的插件和扩展点,可以根据项目需求进行自定义和扩展,使得应用程序更加灵活和可扩展。 4. 简化开发流程:Spring Boot提供了简化的开发流程,包括自动配置和自动装配,使得开发者可以更加专注于业务逻辑而非繁杂的配置。 5. 良好的生态系统:Spring Boot拥有庞大的社区和丰富的文档资源,可以使开发者更容易地解决问题和学习使用框架。 总之,Spring Boot框架通过简化配置和提供大量的便捷工具,使得开发者可以更加高效、快速地构建出高质量的JavaWeb应用程序。 ### 回答3: Spring Boot是一个用于简化Spring应用开发的框架。它通过提供一些默认配置和开箱即用的功能,大大减少了开发者在搭建Spring应用时的工作量和复杂度。使用Spring Boot,开发者可以快速地构建、部署和运行Spring应用。 Spring Boot的设计目标是简化和减少配置,因此它提供了自动配置的特性。通过分析项目的依赖关系,Spring Boot可以自动配置应用程序的各种组件,从而减少了开发者的手动配置的工作量。同时,Spring Boot还提供了一些启动器(Starters),这些启动器封装了常用的依赖项,可以更方便地进行集成和开发。 Spring Boot还提供了一个内嵌的服务器(Embedded Server),开发者可以将应用打包成一个可执行的JAR文件,并通过命令行启动,无需依赖外部的应用服务器。这大大简化了应用程序的部署和运行,并且提供了更好的可移植性。 除了简化和减少配置外,Spring Boot还提供了丰富的开发工具和插件,方便开发者进行调试、监控和测试等工作。它支持热部署,即在应用程序运行的同时可以修改代码,并且能够自动重新加载,提高了开发效率。同时,Spring Boot还提供了健康检查、指标监控等功能,开发者可以更好地了解应用程序的状态和性能。 总之,Spring Boot是一个简化Spring应用开发的框架,通过提供默认配置、自动装配和开箱即用的功能,减少了开发者的工作量和复杂度。它还提供了内嵌的服务器和丰富的开发工具,方便开发者进行部署、运行和调试等工作。使用Spring Boot,开发者可以更快速、更高效地开发出高质量的Spring应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值