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配置
测试类
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(); } }