Spring自动装配Bean及注解开发

tech2023-10-22  99

Spring笔记三:

1、自动装配(AutoWired)

实体类: Dog:

package com.itcast.pojo; public class Dog { public void show(){ System.out.println("这是一只狗"); } }

Cat:

package com.itcast.pojo; public class Cat { public void show(){ System.out.println("这是一只猫"); } }

Person:

package com.itcast.pojo; public class Person { private String name; private Dog dog; private Cat cat; public Person() { } public Person(String name, Dog dog, Cat cat) { this.name = name; this.dog = dog; this.cat = cat; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", dog=" + dog + ", cat=" + cat + '}'; } }

①byName,会自动在容器上下文查找和自己对象set后面的名字值对应的beanid! *.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"> <bean name="dog" class="com.itcast.pojo.Dog"/> <bean name="cat" class="com.itcast.pojo.Cat"/> <bean name="person" class="com.itcast.pojo.Person" autowire="byName"> <property name="name" value="unvi"/> </bean> </beans>

测试:

public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Person person = context.getBean("person", Person.class); person.getDog().show(); person.getCat().show(); }

结果:

②byType,会自动在容器上下文查找和自己对象类型对应的beanid! *.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"> <bean name="dog11" class="com.itcast.pojo.Dog"/> <bean name="cat22" class="com.itcast.pojo.Cat"/> <bean name="person" class="com.itcast.pojo.Person" autowire="byType"> <property name="name" value="unvi"/> </bean> </beans>

测试:

public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Person person = context.getBean("person", Person.class); person.getDog().show(); person.getCat().show(); }

结果:

2、注解开发(Annotation)

The introduction of annotation-based configuration raised the question of whether this approach is “better” than 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/> </beans>

修改: @Autowired 【通过byType】 @Autowired可以直接标注在属性名上,也可以标注在set方法上; 使用@Autowired还可以不写对应的set方法,前提这个属性在spring容器中有装配,符合命名规范 【@Qualifier(value = “cat111”)指定获取唯一beanid】 Person:

package com.itcast.pojo; import org.springframework.beans.factory.annotation.Autowired; public class Person { private String name; @Autowired private Dog dog; @Autowired private Cat cat; public Person() { } public Person(String name, Dog dog, Cat cat) { this.name = name; this.dog = dog; this.cat = cat; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", dog=" + dog + ", cat=" + cat + '}'; } }

*.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 name="cat" class="com.itcast.pojo.Cat"/> <bean name="dog" class="com.itcast.pojo.Dog"/> <bean name="person" class="com.itcast.pojo.Person"/> </beans>

测试和结果和上面一样;

============================================================

*.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.itcast.pojo"/> </beans>

实体类: Cat:

package com.itcast.pojo; import org.springframework.stereotype.Component; @Component public class Cat { public void show(){ System.out.println("这是一只猫"); } }

Dog:

package com.itcast.pojo; import org.springframework.stereotype.Component; @Component public class Dog { public void show(){ System.out.println("这是一只狗"); } }

Person:

package com.itcast.pojo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class Person { @Value("unvi") private String name; @Autowired private Dog dog; @Autowired // @Qualifier(value = "cat111") private Cat cat; public Person() { } public Person(String name, Dog dog, Cat cat) { this.name = name; this.dog = dog; this.cat = cat; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", dog=" + dog + ", cat=" + cat + '}'; } }

/** @Component 相当于在xml中注册bean!

<bean name="xxx" class="com.itcast.pojo.xxx"/>

@Compoent 的衍生(功能都一样) Dao:@Repository Service:@Service Controller:@Controller

*/ 属性值基本类型的用@Value(“XXX”); 引用类型的用@AutoWired 测试: 使用这种方式:自动装配到spring容器中的id为该类的类名

public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Person person = context.getBean("person", Person.class); System.out.println(person.getName()); person.getDog().show(); person.getCat().show(); }

结果:

注解开发和xml配置: xml更加万能,适用于任何的场合,维护简单 注解不是自己的类用不了,维护复杂

【xml和注解的配合】 xml用来管理bean 注解负责属性的注入

使用注解!!一定要开始注解支持!!

<context:annotation-config/> <context:component-scan base-package="com.itcast.pojo"/>
最新回复(0)