https://repo.spring.io/release/org/springframework/spring/5.2.6.RELEASE/
spring 下载地址
spring test 报错 在Project Structure 的 Modules paths output path 和 test output path 不一致
spring xml 方式创建对象:有三种方式
1.<bean id="p" class="com.gql.entity.Person"></bean> 无参构造
2.<bean id="factory" class="com.gql.entity.BeanFactory" factory-method="getInstance"></bean> 静态工厂
/** * * 类说明: * 模拟静态工厂 * @guoqianliang1998. */ public class BeanFactory { public static Person getInstance(){ return new Person(); } }
3.<bean id="factory" class="com.gql.entity.BeanFactory"></bean> <bean id="f" factory-bean="factory" factory-method="getInstance"></bean>
/** * * 类说明: * 模拟工厂实例化 * @guoqianliang1998. */ public class BeanFactory { public Person getInstance(){ return new Person(); } } 实例工厂(鸡肋)
ioc 原理: 读取xml 、 工厂模式 、反射
ioc 接口:Spring 提供IOC容器实现俩种方式:(俩个接口)
1、BeanFactory:IOC容器基本实现,是Spring 内部的使用接口,不提供开发人员进行使用
* 加载配置文件时不会创建对象,在获取对象(使用)才去创建对象。
2、ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
*加载配置文件时候把配置文件对象进行创建
3.ApplicationContext 有实现类
FileSystemXmlApplicationContext 电脑目录下 全路径
ClassPathXmlApplicationContext 项目src 目录下
// User类 要有 set 方法
<bean id="user" class="com.atguigu.spring5.User">
<property name="name1" value="zhangsan"></property>
</bean>
// User类 要有 有参构造 方法
<bean id="user" class="com.atguigu.spring5.User">
<constructor-arg name="name1" value="123"></constructor-arg>
</bean>
// 引入约束 xmlns:p="http://www.springframework.org/schema/p"
<bean id="user" class="com.atguigu.spring5.User" p:name1="111">
</bean>
// 设置空值
<bean id="user" class="com.atguigu.spring5.User">
<property name="name1" >
<null/>
</property>
</bean>
// 特殊符号
1.把<>进行转义 &tls
2.把带特殊符号内容写到CDATA
<bean id="user" class="com.atguigu.spring5.User">
<property name="name1" >
<value><![CDATA[<<南京>>]]>
</property>
</bean>
bean 和 FactoryBean
1.如何设置单实例还是多实例
在spring 配置中 scope =‘prototype’ 多实例 simgleton 单实例
scope =simgleton 在加载配置文件就创建对象
scope =‘prototype’ 在getBean 的时候创建对象
ICO操作Bean 管理(bean生命周期)
(1) 通过构造器创建bean实例(无参构造)
(2)为bean 的属性设置值和对其他bean的引用(调用set方法)
(3)调用bean的初始化方法(需要配置初始化的方法)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭时候,调用bean的摧毁方法(需要进行配置摧毁的方法)
1.什么是自动装配(根据)
autowire 属性常用俩个值:
byName 根据属性名称注入,注入值bean的id 值和类属性名称一样
private Dept dept;
<bean id="user" class="com.atguigu.spring5.User" autowire="byType">
</bean>
<bean id="dept" class="com.atguigu.spring5.Dept"></bean>
byType 根据属性类型注入,
<bean id="user" class="com.atguigu.spring5.User" autowire="byType">
<bean id="dept" class="com.atguigu.spring5.Dept"></bean>
spring 引入 properties 文件
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
例子:<bean id="user" class="com.atguigu.spring5.User" autowire="byName">
</bean>
<bean id="dept" class="com.atguigu.spring5.Dept">
<property name="driver" value="${prop.drive}"></property>
</bean>
<context:property-placeholder location="classpath:jdbc.properties"/>
1. 使用注解目的:简化xml配置
IOC操作Bean
1.什么是注解
2、Spring 针对Bean 管理中创建对象提供注解
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository 持久成 dao
- 上面四个注解功能都是一样的
3.基于注解实现对象创建
第一步,引入aop依赖
spring-aop-*。jar
第二步,开启组件扫码
<context:component-scan base-package="com.atguigu.spring5.testdemo"></contex
第三步,
在注解里面value属性值可以省略不写,默认组是类名称,首字母小写 等价于 bean 注入的id
@Compent(value=userService)
4.基于注解方式实现属性注入
(1)@Autowired :根据属性类型进行自动装配 Interface UserDao (这个类型) 是他的实现类
(2)@Qualifier:根据属性名称进行注入 和上面@Autowired 一起使用,一般默认首字母小写
(3)@Resource:可以根据类型注入,可以根据名称注入
(4)@Value :普通类型注入
@Repository(value = "UserDaoImpl1")
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("add++++");
}
}
@Service
public class UserService {
@Autowired
@Qualifier(value = "UserDaoImpl1")
private UserDao userDao;
public void add(){
System.out.println("service add+++++");
userDao.add();
}
}
5.完全注解开发
(1)创建配置类,代替xml配置文件
@Configuration // 配置类,代替配置文件
@ComponentScan(basePackages = {"com.atguigu"})
public class SpringConfig {
}
(2)编写测试类
@Test
public void testAdd(){
// 1.加载spring配置文件
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.add();
System.out.println( userService);
}
6.AOP
1、连接点
类里面那些方法可以被增强,这些方法称为连接点
2、切入点
实际被真正增加的方法,称为切入点
3.通知(增强)
(1)实际增加的逻辑部分称为通知(增强)
(2)通知有多种类型
前置通知
后置通知
环绕通知
异常通知
最终通知
4.切面
是动作
(1)把通知应用到切入点过程
@Before(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void before(){
System.out.println("before....");
}
5.相同切入点抽取
@Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void pointDemo(){
}
@Before(value = "pointDemo()")
public void before(){
System.out.println("before....");
}
6.有多个增强类同一个方法增强,优先级
@Order(1) 数值越小 优先级越高
把不是spring管理的类 注入到容器中
1.创建GenericApplicationContext对象
GenericApplicationContext context = new GenericaApplicationContext();
2.调用context 的方法对象注册
context.refresh();
context.registerBean(User.class,()->new User());
3.获取在spring 注册的对象
User user = (User)context.getBean("com.atigugu.spring5.text5.User");