IOC:控制反转

    在pom.xml中注入spring-context依赖

    1. <dependency>
    2. <groupId>org.springframework</groupId>
    3. <artifactId>spring-context</artifactId>
    4. <version>5.3.9</version>
    5. </dependency>

    xx.xml的头文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    如何实例化对象
    1)构造器
    默认构造器
    bean中 scope属性决定是否是单例的
    prototype 原型的;非单例的
    singleton 单例的

    1. <!--默认构造器-->
    2. <bean id="car1" class="bean.Car"></bean>

    有参认构造器

    1. <!--有参构造器-->
    2. <bean id="car3" class="bean.Car" >
    3. <constructor-arg index="0" value="10002"></constructor-arg>
    4. <constructor-arg index="1" value="QAQ"></constructor-arg>
    5. <constructor-arg index="2" value="100000"></constructor-arg>
    6. </bean>

    2)静态工厂
    核心配置文件bean

    1. <bean id="car" class="factor.CarFactor" factory-method="getCar">
    2. <constructor-arg index="0" value="BMW"></constructor-arg>
    3. </bean>

    index类中方法的参数位置索引,value方法的参数值
    index可以使用name,name后跟参数对应的参数名
    3)实例化工厂
    核心配置文件bean

    1. <bean id="CarFactor2" class="factor.Carfactor2"></bean>
    2. <bean id="car2" factory-bean="CarFactor2" factory-method="getCar">
    3. <constructor-arg index="0" value="QQ"></constructor-arg>
    4. </bean>

    如何初始化对象信息:
    1)构造器注入

    1. <bean id="car3" class="bean.Car" >
    2. <constructor-arg index="0" value="10002"></constructor-arg>
    3. <constructor-arg index="1" value="QAQ"></constructor-arg>
    4. <constructor-arg index="2" value="100000"></constructor-arg>
    5. </bean>

    2)set注入
    依赖于set方法

    1. <bean id="car4" class="bean.Car" >
    2. <property name="id" value="10004"></property>
    3. <property name="name" value="劳斯莱斯"></property>
    4. <property name="pricce" value="10000000"></property>
    5. </bean>
    1. 3)工厂注入<br />①静态工厂注入
    1. <bean id="car" class="factor.CarFactor" factory-method="getCar">
    2. <constructor-arg index="0" value="BMW"></constructor-arg>
    3. </bean>

    `

    `
    ②实例化工厂注入

    1. <bean id="CarFactor2" class="factor.Carfactor2"></bean>
    2. <bean id="car2" factory-bean="CarFactor2" factory-method="getCar">
    3. <constructor-arg index="0" value="QQ"></constructor-arg>
    4. </bean>

    用到ref
    4)p标签注入

    配置好.xml文件后在创建test类进行测试

    1. public void test2(){
    2. //读取核心配置文件
    3. ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
    4. //获取bean
    5. Car car=(Car) app.getBean("car2");
    6. System.out.println(car);
    7. }

    可变参数传入多个文件名

    1. //读取核心配置文件
    2. ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml","dao.xml")

    通过总的配置文件导入其他配置文件

    1. <import resource="spring.xml"/>
    2. <import resource="dao.xml"/>
    3. <import resource="service.xml"/>

    工厂模式:
    静态工厂

    1. public class CarFactor {
    2. public static Car getCar(String type){
    3. if ("BMW".equals(type)){
    4. return new Car(10000,"宝马",600000);
    5. }else if ("QQ".equals(type)){
    6. return new Car(10001,"Q",50000);
    7. }else {
    8. return null;
    9. }
    10. }
    11. }

    实例化工厂

    1. public class CarFactor {
    2. public Car getCar(String type){
    3. if ("BMW".equals(type)){
    4. return new Car(10000,"宝马",600000);
    5. }else if ("QQ".equals(type)){
    6. return new Car(10001,"Q",50000);
    7. }else {
    8. return null;
    9. }
    10. }
    11. }

    `

    `
    各种类型属性的配置
    有一个User类

    1. public class User {
    2. private int id;
    3. private String sname;
    4. private Date brith;
    5. private String[] hobby;
    6. private List<String> ulist;
    7. private Set<String> uset;
    8. private Map<String,Object> maps;
    9. private Properties prop;
    10. public User() {
    11. }
    12. public int getId() {
    13. return id;
    14. }
    15. public void setId(int id) {
    16. this.id = id;
    17. }
    18. public String getSname() {
    19. return sname;
    20. }
    21. public void setSname(String sname) {
    22. this.sname = sname;
    23. }
    24. public Date getBrith() {
    25. return brith;
    26. }
    27. public void setBrith(Date brith) {
    28. this.brith = brith;
    29. }
    30. public String[] getHobby() {
    31. return hobby;
    32. }
    33. public void setHobby(String[] hobby) {
    34. this.hobby = hobby;
    35. }
    36. public List<String> getUlist() {
    37. return ulist;
    38. }
    39. public void setUlist(List<String> ulist) {
    40. this.ulist = ulist;
    41. }
    42. public Set<String> getUset() {
    43. return uset;
    44. }
    45. public void setUset(Set<String> uset) {
    46. this.uset = uset;
    47. }
    48. public Map<String, Object> getMaps() {
    49. return maps;
    50. }
    51. public void setMaps(Map<String, Object> maps) {
    52. this.maps = maps;
    53. }
    54. public Properties getProp() {
    55. return prop;
    56. }
    57. public void setProp(Properties prop) {
    58. this.prop = prop;
    59. }
    60. @Override
    61. public String toString() {
    62. return "User{" +
    63. "id=" + id +
    64. ", sname='" + sname + '\'' +
    65. ", brith=" + brith +
    66. ", hobby=" + Arrays.toString(hobby) +
    67. ", ulist=" + ulist +
    68. ", uset=" + uset +
    69. ", maps=" + maps +
    70. ", prop=" + prop +
    71. '}';
    72. }
    73. }

    对其中各种类型的属性进行注入

    1. <bean id="u1" class="bean.User">
    2. <!--int String类型变量注入-->
    3. <property name="id" value="101"></property>
    4. <property name="sname" value="麒麟子"></property>
    5. <!--String[]类型变量注入-->
    6. <property name="hobby" >
    7. <array>
    8. <value>吸烟</value>
    9. <value>喝酒</value>
    10. <value>烫头</value>
    11. </array>
    12. </property>
    13. <!--List<String>类型变量注入-->
    14. <property name="ulist">
    15. <list>
    16. <value>aaa</value>
    17. <value>bbb</value>
    18. <value>ccc</value>
    19. </list>
    20. </property>
    21. <!--Set<String>类型变量注入-->
    22. <property name="uset">
    23. <set>
    24. <value>语文</value>
    25. <value>数学</value>
    26. <value>英语</value>
    27. </set>
    28. </property>
    29. <!--Map<String,Object>类型变量注入-->
    30. <property name="maps">
    31. <map>
    32. <entry key="中国银行" value="1224525442544222222"></entry>
    33. </map>
    34. </property>
    35. <!--Propertise类型变量注入-->
    36. <property name="prop">
    37. <props>
    38. <prop key="driver">com.mysql.jdbc.Driver</prop>
    39. <prop key="url">jdbc:mysql:///java11</prop>
    40. <prop key="username">root</prop>
    41. <prop key="password">123456</prop>
    42. </props>
    43. </property>
    44. <!--Date类型变量注入-->
    45. <property name="brith" ref="date"></property>
    46. </bean>
    47. <bean id="date" class="java.util.Date">
    48. <property name="year" value="2011"></property>
    49. <property name="month" value="11"></property>
    50. <property name="date" value="11"></property>
    51. </bean>

    junit注解
    @Test 测试注解
    @Before 测试之前运行注解 可做测试前准备工作
    @After 测试之后运行注解

    注解开发IOC
    自动装配
    @Autowired
    1.配置环境

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:p="http://www.springframework.org/schema/p"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xmlns:context="http://www.springframework.org/schema/c"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    2开始自动化注入

    1. <!-- 开始注解-->
    2. <context:annotation-config/>
    3. <!-- 实例化Dao-->
    4. <bean id="userDao" class="com.xxxx.dao.UserDao"></bean>
    5. <!--实例化Service-->
    6. <bean id="userService" class="com.xxxx.service.UserService"></bean>

    可使用@Autowired注解,是根据类型装配
    配合使用@Qualifier(value = “ueseDao”),选择自己要注入的

    @Resource
    import javax.annotation.Resource;
    环境配置
    在pom.xml中注入

    1. <dependency>
    2. <groupId>javax.annotation</groupId>
    3. <artifactId>javax.annotation-api</artifactId>
    4. <version>1.3.2</version>
    5. </dependency>

    使用@Resource(name = “userDao”)根据名字注入
    优先根据名称查找,若不写名称,根据类型查找

    注解开发:
    设置自动化扫描

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:p="http://www.springframework.org/schema/p"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xmlns:context="http://www.springframework.org/schema/context"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    8. <!-- 开启扫描-->
    9. <context:component-scan base-package="com.xxxx"/>
    10. </beans>

    注解:
    任意类:
    @Component 组件
    dao层
    @Repository 仓库

    1. @Repository
    2. public class UserDao {
    3. public void test(){
    4. System.out.println("UserDao test....");
    5. }
    6. }

    service层
    @Service 服务层

    1. @Service
    2. public class UserService {
    3. @Autowired
    4. private UserDao userDao;
    5. public void test(){
    6. System.out.println("UserService test......");
    7. userDao.test();
    8. }
    9. }

    contorller层
    @Controller 控制层

    1. @Controller("uc")
    2. public class UserController {
    3. @Autowired
    4. private UserService userService;
    5. public void test11(){
    6. System.out.println("UserContorller test...");
    7. userService.test();
    8. }
    9. }

    bean的作用域和生命周期
    作用域:
    默认情况瞎,从spring容器中拿到的对象都是单例的
    Spring SpringMVC MyBatis入门 - 图1
    lazy -int=”true”时,spring启动的时候 不会去实例化这个bean,调用时才会去实例化;false时,spring启动时实例化这个bean

    prototype作用域
    image.png
    每次向spring容器请求获取bean都会得到一个全新的bean,相对于singleton来说不缓存

    bean的创建和销毁可由自己决定
    有一个User类

    1. public class User {
    2. private int id;
    3. private String name;
    4. private String psw;
    5. public User() {
    6. System.out.println("构造器调用了");
    7. }
    8. public User(int id, String name, String psw) {
    9. this.id = id;
    10. this.name = name;
    11. this.psw = psw;
    12. }
    13. public void init(){
    14. System.out.println("init..执行了");
    15. }
    16. public void destroy(){
    17. System.out.println("destory.......执行了");
    18. }
    19. public int getId() {
    20. return id;
    21. }
    22. public void setId(int id) {
    23. this.id = id;
    24. }
    25. public String getName() {
    26. return name;
    27. }
    28. public void setName(String name) {
    29. this.name = name;
    30. }
    31. public String getPsw() {
    32. return psw;
    33. }
    34. public void setPsw(String psw) {
    35. this.psw = psw;
    36. }
    37. @Override
    38. public String toString() {
    39. return "User{" +
    40. "id=" + id +
    41. ", name='" + name + '\'' +
    42. ", psw='" + psw + '\'' +
    43. '}';
    44. }
    45. }

    其中定义了init和destory方法
    在spring02.xml文件中配置该类的bean,将User类中的init方法和destroy方法给init-method和destroy-method

    1. <bean id="user" class="com.xxxx.bean.User" scope="singleton" init-method="init" destroy-method="destory">
    2. <property name="id" value="1001"></property>
    3. <property name="name" value="lisi"></property>
    4. <property name="psw" value="123456"></property>
    5. </bean>

    这样就可以通过调用方法来决定bean合适被销毁


    spring AOP
    aop:面向切面编程
    注入springAop

    1. <!-- 注入spring Aop-->
    2. <dependencies>
    3. <dependency>
    4. <groupId>org.aspectj</groupId>
    5. <artifactId>aspectjweaver</artifactId>
    6. <version>1.8.9</version>
    7. </dependency>
    8. </dependencies>

    添加spring.xml的配置
    添加命名空间

    1. xmlns:aop="http://www.springframework.org/schema/aop"
    2. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"

    配置文件

    1. <!-- 注解开发aop-->
    2. <aop:aspectj-autoproxy/>

    aopsprig.xml相关配置

    1. <!-- aop相关配置-->
    2. <aop:config>
    3. <!-- aop切面-->
    4. <aop:aspect ref="cutLog">
    5. <!-- 定义切入点-->
    6. <aop:pointcut id="cut" expression="execution(* com.xxx.service.UserService.add*(..))"/>
    7. <!-- 配置前置通知方法名,并引入切入点-->
    8. <aop:before method="addLog" pointcut-ref="cut"/>
    9. <!-- 配置返回通知方法名-->
    10. <aop:after-returning method="setLog" pointcut-ref="cut"/>
    11. <!-- 配置指定异常通知-->
    12. <aop:after-throwing method="" pointcut-ref="cut"/>
    13. <!-- 配置最终通知-->
    14. <aop:after method="" pointcut-ref="cut"/>
    15. <!-- 配置环绕通知-->
    16. <aop:around method="" pointcut-ref="cut"/>
    17. </aop:aspect>
    18. </aop:config>


    aop vs oop
    切面:
    切点:
    增强|通知:
    advice
    Before
    After
    around
    连接点:目标对象所有的方法都是连接点,连接点不一定是切点,切点一定是连接点
    织入:将切面应用到目标对象并生成代理对象的这个过程即为织入
    引入:在不修改原有应用程序代码的情况下,在程序运行期间为类动态添加方法或字段的过程



    springmvc

    servlet的主要作用:
    1)映射:将目标方法映射地址栏
    2)接收参数request
    3)存储数据
    作用域对象
    4)页面转发