**1、Bean的作用域**
- 代理模式
Spring默认为单例模式,scope=“singleton”
<bean id="user" class="com.hua.pojo.User" p:name="张三2" p:age="22" scope="singleton"/>
- 原型模式
每次从容器中get的时候,都会产生一个新对象,scope=“prototype”
<bean id="user2" class="com.hua.pojo.User" c:name="张三3" c:age="20" scope="prototype"/>
**2、Bean的自动装配**
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并自动给Bean装配属性
在Spring中有三种方式自动装配bean(重要)
- 在XML中显示的配置
- 在java中显示配置
- 隐式的自动装配bean(重要)
测试
显示配置:
<bean id="cat" class="com.hua.pojo.Cat"/>
<bean id="dog" class="com.hua.pojo.Dog"/>
<bean id="people" class="com.hua.pojo.People">
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
<property name="name" value="张三"/>
</bean>
自动装配:
- byName
该方法id名跟对应的对象名必须相同
可以定义多个类型相同的bean,但是要保证bean的id唯一
<bean id="cat" class="com.hua.pojo.Cat"/>
<bean id="dog" class="com.hua.pojo.Dog"/>
<!--byName会自动在容器上下文中查找,和自己对象set方法后面的值相对应的beanId-->
<bean id="people" class="com.hua.pojo.People" autowire="byName">
</bean>
- byType
该方法id名可以不同,但是class后面的类型必须相同。
要保证所有的bean的class唯一
不能定义多个类型
<bean id="cat" class="com.hua.pojo.Cat"/>
<bean id="dog2" class="com.hua.pojo.Dog"/>
<!--byType会自动在容器上下文中查找,和自己对象类型相同的Bean-->
<bean id="people" class="com.hua.pojo.People" autowire="byType">
</bean>
**3、使用注解自动装配**
导入约束:context约束
配置注解的支持:context:annotation-config
<?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
http://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
可以直接在属性上使用,也可以在set方法上使用
@Autowired
private Cat cat;
该注解可以忽略set方法,在属性上写上该注解可以直接装配Bean
@Autowired
private Cat cat;
@Autowired
private Dog dog;
<bean id="cat" class="com.hua.pojo.Cat"/>
<bean id="dog" class="com.hua.pojo.Dog"/>
<bean id="people" class="com.hua.pojo.People">
</bean>
@Resource
与@Autowired区别:
都是用来自动装配的,都可以放在属性字段上
@Autowired通过byType的方式实现,而且必须要求这个对象存在
@Resource默认通过byname的方式实现,如果找不到byname就通过byType实现,如果都找不到则报错
执行顺序不同,@Autowired先执行byType,@Resource先执行byname
**4、使用注解开发**
使用注解开发之前,要先查看aop的包是否导入
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/96abca4a66813994ef741e7642c5ec21.png)
创建导入context依赖,增加注解支持
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/623a8d1c28ea4756bf7ff736cfccde78.png)
<?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
http://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.hua.pojo"/>
</beans>
增加支持
<!--指定要扫描的包,这个包下面的注解就会生效-->
<context:component-scan base-package="com.hua.pojo"/>
开始测试
-
@Component
有两种形式1、@Component 2、@Component(value = "USER") 该注解作用在实体类上,使用该注解不需要再在XML中装配Bean。 第一种方法:context.getBean("user",User.class);默认为类名的小写。 第二种方法可以自定义value。
//等价于<bean id="user" class="com.hua.pojo.User"/>
//@Component组件
@Component(value = "USER")
public class User {
public String name="张三";
}
@Test
public void text1(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=context.getBean("USER",User.class);
System.out.println(user.name);
}
}
- @Value注解 :属性注入
//相当于<property name="name" value="张三"/>
@Value("张三")
public String name;
-
衍生的注解
@Component有几个衍生的注解,一般按照mvc三层架构分层
dao:[@Repository]
service:[@Service]
controller:[@Controller]
功能都是将某个类注册到Spring中,装配Bean
小结:
XML相对更加万能,适用于任何场合,维护简单
注解,不是自己的类使用不了,维护相对复杂
一般XML用来管理Bean,注解用来属性注入。
<!--注解支持:-->
<!--指定要扫描的包,这个包下面的注解就会生效-->
<context:component-scan base-package="com.hua"/>
<context:annotation-config/>