<Bean>
1.默认使用无参方法创建对象,也可以使用有参方法构造
2.需要被注入对象的Set方法
3.bean的配置
<!--bean就是java对象,由Spring创建和管理-->
<!--
id 是bean的标识符,要唯一,如果没有配置id,name就是默认标识符
如果配置id,又配置了name,那么name是别名
name可以设置多个别名,可以用逗号,分号,空格隔开
如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象;
class是bean的全限定名=包名+类名
-->
<bean id="" class="" name="">
<property name="" value=""/>
<property name="" ref=""/>
</bean>
4.项目中如果有多个人开发,可以利用import将所有人的xml配置到一个applicationContext合作开发使用
<import resource="{path}/beans.xml"/>
5.注入的方式有三种构造器注入,set注入,扩展方式注入,下面介绍set方法注入:
常量注入,bean注入,数组注入,List注入,Map注入,set注入,null注入,Properties注入
6.对于构造器注入与set注入有两种简便方式——p命名空间 c命名空间
导入约束 : xmlns:p="http://www.springframework.org/schema/p" <!--P(属性: properties)命名空间 , 属性依然要设置set方法--> <bean id="user" class="com.kuang.pojo.User" p:name="狂神" p:age="18"/>
导入约束 : xmlns:c="http://www.springframework.org/schema/c"
<!--C(构造: Constructor)命名空间 , 属性依然要设置set方法--> <bean id="user" class="com.kuang.pojo.User" c:name="狂神" c:age="18"/>
7.bean的作用域
Singleton
当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例
<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">
Prototype
当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例
<bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>
或者
<bean id="account" class="com.foo.DefaultAccount" singleton="false"/>
Request
表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效
<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
Session
当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
8.Spring中有三种装配机制
在xml中显式配置;
在java中显式配置;
隐式的bean发现机制和自动装配。
下面主要介绍第三种
autowire byName (按名称自动装配)
当一个bean节点带有 autowire byName的属性时。
将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。
去spring容器中寻找是否有此字符串名称id的对象。
如果有,就取出注入;如果没有,就报空指针异常。
autowire byName (按名称自动装配)
使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。
9.利用注解实现自动装配
使用注解之前需要在xml中引入context文件头
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
而后启动注解支持
<context:annotation-config/>
10.自动装配注解
@Autowired
-
@Autowired是按类型自动转配的,不支持id匹配。
-
需要导入 spring-aop的包!
-
按照类型转置,将所需要注入的的bean放入配置文件中,将注解在属性上标注即可使用
@Autowired(required=false) 说明:false,对象可以为null;true,对象必须存对象,不能为null
@Qualifier
-
@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
-
@Qualifier不能单独使用。
-
按照bean内的id寻找需要注入的属性
@Resource
-
@Resource如有指定的name属性,先按该属性进行byName方式查找装配;
-
其次再进行默认的byName方式进行装配;
-
如果以上都不成功,则按byType的方式自动装配。
-
都不成功,则报异常。
11.组件注解Component以及其三个衍生注解,功能相同只为区分MVC三层架构
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
-
@Controller:web层
-
@Service:service层
-
@Repository:dao层
使用这些就相当于取代了配置文件中的<bean>了,但是在使用之前要在配置文件中设置需要扫描的包,还要设置context文件头,如第9点所示
<!--指定注解扫描包-->
<context:component-scan base-package="com.kuang.pojo"/>
12.基于Java类进行配置
可以通过构建Config类,在c类上面加注解@Configuration,代表这是一个配置类
狂神说Spring05:使用注解开发【狂神说Java】Spring5最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili 15集
13.代理模式
【狂神说Java】Spring5最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili 18集
14.动态代理(我蒙了)
public class ProxyInvocationHandler implements InvocationHandler {
//1.接口
private Rent rent;
//2.set接口
public void setRent(Rent rent) {
this.rent = rent;
}
//3.生成代理类,重点是第二个参数,获取要代理的抽象角色!之前都是一个角色,现在可以代理一类角色
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
rent.getClass().getInterfaces(),this);
}
// proxy : 代理类 method : 代理类的调用处理程序的方法对象.
//4. 处理代理实例上的方法调用并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seeHouse();
//核心:本质利用反射实现!
Object result = method.invoke(rent, args);
fare();
return result;
}
//看房
public void seeHouse(){
System.out.println("带房客看房");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
}
记住即可,唯一改变的是接口,还有其他的中间过程
//租客
public class Client {
public static void main(String[] args) {
//1.真实角色
Host host = new Host();
//2.代理实例的调用处理程序
ProxyInvocationHandler pih = new ProxyInvocationHandler();
//3.将真实角色放置进去!
pih.setRent(host);
//4.动态生成对应的代理类!
Rent proxy = (Rent)pih.getProxy();
//5.调用方法
proxy.rent();
}
}
15.实现AOP的三种方式(我也蒙了)
一.使用SpringAPI实现
二.自定义类实现
三.使用注解实现