笔记代码:https://github.com/cqf073(内带23种设计模式)
自动装配:不需要配置xml里面的bean代码,Spring会在上下文中自动寻找并装配。
测试类:一个人拥有连个宠物(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()); } }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原理:会在容器上下文查找 自己对象里面属性一样类型的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/
可以忽略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
value可以指定前面的bean的id名字指定注入
原理:先通过名字查找再通过类型查找(两个失败的时候报错)
@Resourse(name=“”)可以指定一个id名字
小结:@Resourse和@Autowired(常用)的区别:都可以写在属性字段上面 Autowired通过类型 Resourse先通过名字后通过类型
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/ 开启注解支持
意思为组件! 代表这个类被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等价于在类里面写出来一个
@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上面
前提在xml中扫描包里面的注解!
@Component的衍生
dao层 @repository将他注册到bean里面
service层 @Service
controller层 @controller
上面有
单例模式…
总结:xml方便配置
注解的维护相对复杂
约定:xml管理bean 注解只实现属性的注入
注意:在xml中要让注解生效和扫描包里面的注解。(重点)
相当于一个组件 放到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(); } }