JAVA Spring 注解开发(Idea版)

tech2024-11-09  14

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等价于在类里面写出来一个

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(); } }
最新回复(0)