Spring学习笔记之依赖的注解(2)

Spring学习笔记之依赖的注解(2)
1.0 注解,不能单独存在,是Java中的一种类型
1.1 写注解
1.2 注解反射
2.0 spring的注解
spring的
@Controller@Component@Service//更多典型化注解,但是@Controller@Service建议使用
@service(“personService”)可以代替set get 方法,@Resource(name=personDao)
@Autowired//按照类型匹配
@Qualifier(“student”)两者结合相当于id匹配
相当于java的@Resource(name=”student”)
3.0 DI(依赖注入)的注解@Resource、@PostConstruct
applicationContext.xml

<?xml version="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-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <bean id="person" class="come.demo.spring.di.annotation.Person">
    </bean>
    <bean id="student" class="come.demo.spring.di.annotation.Student"></bean>
    <context:annotation-config></context:annotation-config>
</beans>

Person.java

public class Person {
    /**
     * @Autowired
       @Qualifier("student")
       ==
       @Resource(name="student")
     */
    @Resource(name="student")
    private Student student;

    @PostConstruct  //在构造器之后
    public void init(){
        System.out.println("init");
    }

    @PreDestroy //在spring容器销毁之前
    public void destroy(){

    }

    public void say(){
        this.student.say();
    }
}

Student.java
public class Student {
public void say(){
System.out.println(“student”);
}
}

PersonTest.java

public class PersonTest {
    /**
     * 1、启动spring容器
     * 2、把spring配置文件中的bean实例化(person,student)
     * 3、当spring容器解析配置文件
     *     <context:annotation-config></context:annotation-config>
     *    spring容器会在纳入spring管理的bean的范围内查找哪些类的属性上是否加有@Resource注解
     * 4、如果在属性上找到@Resource注解
     *      如果@Resource的注解的name属性的值为""
     *           则把@Resource所在的属性的名称和spring容器中的id作匹配
     *                  如果匹配成功,则赋值
     *                  如果匹配不成功,则会按照类型进行匹配
     *                      如果匹配成功,则赋值,匹配不成功,报错
     *      如果@Resource的注解的name属性的值不为""
     *           则解析@Resource注解name属性的值,把值和spring容器中的ID进行匹配
     *               如果匹配成功,则赋值
     *               如果匹配不成功,则报错
     *
     * 说明:
     *     注解代码越来越简单,效率越来越低
     *     注解只能应用于引用类型
     */
    @Test
    public void testDIAnnotation(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = (Person)context.getBean("person");
        person.say();
    }
}
4.0 scan-类扫描的注解(减少配置代码,却降低了性能)
    4.1 配置文件
    <context:component-scan
        base-package="com.demo.spring.scan.annotation"></context:component-scan
    4.2 原理:
    0.0 把一个类放到spring容器中,该类也称为component
    1.0 启动spring容器
    2.0 当spring容器解析配置文件时,会去base-package指定的包及子包中扫描所有的类。
    3.0 把类放到spring容器中
        看哪些类上面是否加有@Component注解
        如果该类上面有@Component注解
            检查该类的value属性是否为““
                如果为”“,则会把该类注解所在的类的类名以这样的方式
                @Component
                public class Person{
                }
                ==
                <bean id = "person" class="..person"
        如果该类的value不为空,则以这样的形式:
        @Component("aa")
        public class Person{}
        ==
        <bean id="aa" class="..Person"
    4.0 扫描spring容器中所有的bean,进行@Resource规制

5.0 小结

    1、IOC把一个类放到容器里边,spring容器给他创建对象
    1.1 spring创建对象的三种方式
        1 默认构造函数 2.静态工程3.实例工程
        默认情况下把一个类放到spring容器里面,默认是单例。
        什么时候创建单例对象?
            默认情况下spring容器启动时候创建单例对象。
            但是把lazy-init="true"的话,是在contextgetbean时候才创建对象。
            如果scope="property"即多例,在contextgetbean时候才创建对象。
        初始化(init,只需要在配置文件中init-method,spring容器在调用完构造器立即自动调用)
        销毁(destroy,在spring容器销毁时候才内部调用)

    2、DI给属性赋值
        2.1赋值方法
        利用set方法可以给属性赋值还可以利用构造器,也可以用注解。进行注入。
        基本属性、引用类型、集合进行装配。
        @Resource用于给一个属性进行注入。
        类扫描<context:component-scan减少配置文件代码。

6.0 spring注解的继承
xml的继承需要,parent:spring容器中的继承
而注解的继承配置文件不需要parent。

时间: 2024-09-29 14:04:17

Spring学习笔记之依赖的注解(2)的相关文章

spring学习笔记(4)依赖注入详解

常用的注入方式有四种: 1. 属性注入 2. 构造方法注入 3. 工厂方法注入 4. 注解注入 下面先定义我们后面用到的POJO类: package test; public class User { private String name; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public St

spring学习笔记(10)@AspectJ研磨分析[1]入门、注解基本介绍

@AspectJ准备 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. 在使用AspectJ之前,我们需要导入aspectJ相应的jar包,可到我的资源页http://download.csdn.net/detail/qwe6112071/9468329 中下载,而如果使用maven则可直接在pom.xml中加入如下代码: <dependency> <groupId>o

spring学习笔记(13)基于Schema配置AOP详解

基于Schema配置入门实例 除了基于@AspectJ注解的形式来实现AOP外,我们还可以在IOC容器中配置.先来看看一个常见的应用场景,在我们的web项目中,我们需要为service层配置事务,传统的做法是在每个业务逻辑方法重复下面配置中: Created with Raphaël 2.1.0程序开始1. 获取DAO层封装好的数据库查询API,如HIbernate中的SessionFactory/Session和mybatis中的xxxMapper2. 开启事务3. 根据入参查询数据库完成相应

spring学习笔记(19)mysql读写分离后端AOP控制实例

在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等.实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些.既然如此,在本例中,我们就完成读写分离的模拟在web端的配置实例. 续上次的例子,关于JNDI数据源的配置和spring datasource的配置这里不再重复.下面着重加入AOP实现DAO层动态分库调用.可先看上篇文章<spring学习笔记(18)使用JNDI模拟访问应用服务器多数据源实例 >

spring学习笔记(21)编程式事务配置,service层概念引入

访问数据库事务导入 在我之前的文章<spring学习笔记(19)mysql读写分离后端AOP控制实例>中模拟数据库读写分离的例子,在访问数据库时使用的方法是: public <E> E add(Object object) { return (E) getSessionFactory().openSession().save(object); } 通过直接开启session而后保存对象.查询数据等操作,是没有事务的.而如果我们的项目规模变大,业务逻辑日益复杂,我们在一个方法中进行大

Spring学习笔记之aop动态代理(3)

Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. PersonDao.java public interface PersonDao { public void savePerson(); } PersonDaoImpl.java public class PersonDaoImpl implements PersonDao{ public void save

Spring学习笔记2之表单数据验证、文件上传实例代码_java

在上篇文章给大家介绍了Spring学习笔记1之IOC详解尽量使用注解以及java代码,接下来本文重点给大家介绍Spring学习笔记2之表单数据验证.文件上传实例代码,具体内容,请参考本文吧! 一.表单数据验证 用户注册时,需要填写账号.密码.邮箱以及手机号,均为必填项,并且需要符合一定的格式.比如账号需要32位以内,邮箱必须符合邮箱格式,手机号必须为11位号码等.可以采用在注册时验证信息,或者专门写一个工具类用来验证:来看下在SpringMVC中如何通过简单的注释实现表单数据验证. 在javax

Spring学习笔记3之消息队列(rabbitmq)发送邮件功能_java

rabbitmq简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.其中较为成熟的MQ产品有IBM WEBSPHERE MQ. 本节的内容是用户注册时,将邮

spring学习笔记(16)趣谈spring 事件机制[2]:多监听器流水线式顺序处理

上一篇我们使用到的ApplicationListener是无序的,结合异步调度它能满足了我们的大部分应用场景,但现在我们来个另类的需求,我们来模拟一条作业调度流水线,它不能异步,必须按照先后次序执行不同的任务才能得到我们的最终结果. 需求示例:现在假如华中科技大学的小白想要为它的智能机器人作品申报国家创新奖,需要经过学校.省级创新科研机构.国家创新科研机构逐层审核.我们尝试通过事件来实现,核心就在监听器实现SmartApplicationListener接口.示例如下: 1. 配置事件发布者小白