JAVA Spring 注解开发(Idea版)

 

JAVA Spring 注解开发(Idea版)

 

笔记代码:https://github.com/cqf073(内带23种设计模式)

 

Bean的自动转配

 

自动装配:不需要配置xml里面的bean代码,Spring会在上下文中自动寻找并装配。

 

Spring的三种配置

 

1.xml的显示配置

 

2.java代码的配置

 

3.隐式的自动装配(重要)

 

配置环境

 

测试类:一个人拥有连个宠物(xml的显示配置)

 

cat类

 

public class Cat {
   public void action(){
       System.out.println("cat");

  }}

 

dog类

 

public class Dog {
   public void  action(){
       System.out.println("dog");
  }
}

 

people类

 

public class People {
   private Cat cat;
   private Dog dog;
   private  String  name;

   public Cat getCat() {
       return cat;
  }

   public void setCat(Cat cat) {
       this.cat = cat;
  }

   public Dog getDog() {
       return dog;
  }

   public void setDog(Dog dog) {
       this.dog = dog;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }
}

 

注意:一定要有set方法 因为注入是set注入

 

xml配置

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">
   <!--spring创建对象 相当于对象 property 属性设置值 class 给要new对-->

<bean id="cat" class="com.cqf.pojo.Cat"/>
   <bean id="dog" class="com.cqf.pojo.Dog"/>
   <bean id="people" class="com.cqf.pojo.People">
       <property name="name" value="lisi"/>
       <property name="cat" ref="cat"/>
       <property name="dog" ref="dog"/>
   </bean>


</beans>

 

测试类

 

public class Mytest {
   public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationConext.xml");
       People people = context.getBean("people", People.class);

       System.out.println(people.getName());
  }
}

 

Byname装配

 

xml配置

 

<bean id="cat" class="com.cqf.pojo.Cat"/>
   <bean id="dog" class="com.cqf.pojo.Dog"/>
   <bean id="people" class="com.cqf.pojo.People" autowire="byName">
       <property name="name" value="lisi"/>
       <!--<property name="cat" ref="cat"/>-->
       <!--<property name="dog" ref="dog"/>-->
   </bean>


</beans>

 

byname

 

byname 的原理:会在容器上下文查找 自己对象的set方法构面的setXXX的名字的XXX的bean的id

 

xml错误案例:

 

<bean id="cat" class="com.cqf.pojo.Cat"/>
   <bean id="dog123" class="com.cqf.pojo.Dog"/>
   <bean id="people" class="com.cqf.pojo.People" autowire="byName">
       <property name="name" value="lisi"/>
     
   </bean>

 

这个里的dog就不会被自动装配到people类里面 因为 people 的set方法里面是setDog 所以只会自动装配id为Dog的bean

 

Bytype装配

 

bytype原理:会在容器上下文查找 自己对象里面属性一样类型的bean进行自动装配

 

<bean id="ca123123t" class="com.cqf.pojo.Cat"/>
   <bean id="dog13" class="com.cqf.pojo.Dog"/>
   <bean id="people" class="com.cqf.pojo.People" autowire="byType">
       <property name="name" value="lisi"/>
       <!--<property name="cat" ref="cat"/>-->
       <!--<property name="dog" ref="dog"/>-->
   </bean>

 

装配成功

 

总结:类型相同的话 必须class保证全局唯一 如果是byname必须set后面的名字和bean的id相同才能装配成功

 

使用注解实现自动装配

 

jdk5以后支持注解 Spring2以后支持注解

 

使用注解须知:

 

配置注解支持:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>

 

context的约束和context:annotation-config/

 

注解Autowired(通过Byname)

 

可以忽略set方法!因为这个使用反射来实现的!

 

ApplicationContext.xml

 

<!--切记一定要开启注解支持-->

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

     <context:annotation-config/>
    <!--切记一定要开启注解支持-->
    <bean id="ca123123t" class="com.cqf.pojo.Cat"/>
    <bean id="dog13" class="com.cqf.pojo.Dog"/>
    <bean id="people" class="com.cqf.pojo.People"/>
</beans>

 

people类

 

public class People {
    @Autowired
    private Cat cat;
    @Autowired
    private Dog dog;
    private  String  name;

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

前提是id与对象的名字一样的

 

将注解放到set也是一样的作用

 

public class People {
    @Autowired
    private Cat cat;

    private Dog dog;
    private  String  name;

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }
    @Autowired
    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

补充:@Nullable 这个字段可以为null

 

@Autowired(required = false)显示的定义 说明这个对象可以为null

 

@Qualifier()注解

 

@Autowired(required = false)
@Qualifier(value="cat2323")
private Cat cat;

 

value可以指定前面的bean的id名字指定注入

 

@Resourse

 

原理:先通过名字查找再通过类型查找(两个失败的时候报错)

 

@Resourse(name=“”)可以指定一个id名字

 

小结:@Resourse和@Autowired(常用)的区别:都可以写在属性字段上面 Autowired通过类型 Resourse先通过名字后通过类型

 

使用注解开发

 

1.bean的注解

 

 

 

xml的配置

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config/>
<context:component-scan base-package="com.cqf.pojo"/>

</beans>

 

<context:component-scan base-package="com.cqf.pojo"/>扫下面的所有的注解

 

context:annotation-config/ 开启注解支持

 

@Component

 

意思为组件! 代表这个类被Spring容器托管了

 

people类

 

@Component
public class People {
    @Autowired(required = false)
    @Qualifier(value="cat2323")
    private Cat cat;

    private Dog dog;
    private  String  name;

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }
    @Autowired
    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

@Component等价于在类里面写出来一个<bean id="people" class="com.cqf.pojo.People"/>

 

2.属性的注入

 

@Value

 

@Component
public class People {
    @Autowired(required = false)
    @Qualifier(value="cat2323")
    private Cat cat;

    private Dog dog;
    @Value("lixiaosi")
    private  String  name;

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }
    @Autowired
    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }
	@Value("lixiaosi")
    public void setName(String name) {
        this.name = name;
    }
}

 

相当于properties name=“ ” value=“”

 

也可以放在set上面

 

3.衍生的注解(装配bean)

 

前提在xml中扫描包里面的注解!

 

@Component的衍生

 

dao层 @repository将他注册到bean里面

 

service层 @Service

 

controller层 @controller

 

4.自动转配

 

上面有

 

5.作用域

 

@Scope("singleton")
public class Dog {
    public void  action(){
        System.out.println("dog");
    }
}

 

单例模式....

 

总结:xml方便配置

 

注解的维护相对复杂

 

约定:xml管理bean 注解只实现属性的注入

 

注意:在xml中要让注解生效和扫描包里面的注解。(重点)**

 

java代码的配置(@Configuration)

 

相当于一个组件 放到Spring的组件里面

 

使用java配置java的xml项目

 

在一个类上面放@Configuration相当于在xml中配置bean

 

可以做xml的配置信息

 

@Configuration
public class Myconfig {
    @Bean
    public  Cat getcat(){
        return new Cat();
    }
}

 

解释:返回值相当于bean的class的属性

 

方法名字可以理解bean 的id属性

 

return返回注入容器的对象

 

cat类

 

@Component
public class Cat {
    public void action(){
        System.out.println("cat");

    }}

 

 

 

测试类

 

public class Mytest {
    public static void main(String[] args) {
        Cat getcat = new AnnotationConfigApplicationContext(Myconfig.class).getBean("getcat", Cat.class);
        getcat.action();
    }
}

 

 

 

得到的Bean的id为返回对象的方法名字

 

补充:

 

多个自己的实现bean的配置对象@Import(myconfig.class) 传入class对象

 

@Configuration
@ComponentScan("com.cqf.pojo")
@Import(myconfig.class)
public class Myconfig {
    @Bean
    public  Cat getcat(){
        return new Cat();
    }
}

 

 

 

posted @ 2020-09-03 21:47  乘清风  阅读(369)  评论(0编辑  收藏  举报